[0.4.13][AUDIOSRV] Update to master state 2023-02-18

by porting back:
0.4.15-dev-5710-g 9672dc5047 CORE-16912 [AUDIOSRV] Overhaul logging interfaces (#5067)
0.4.15-dev-445-g 353b544047 CORE-16814 [AUDIOSRV] Disable Logging to file (#2599)
This commit is contained in:
Joachim Henze 2023-03-13 21:07:55 +01:00
parent a23fca7951
commit 21fd732ea9
9 changed files with 88 additions and 126 deletions

View file

@ -5,11 +5,10 @@ list(APPEND SOURCE
pnp_list_lock.c
pnp.c
services.c
debug.c
audiosrv.h)
add_executable(audiosrv ${SOURCE} audiosrv.rc)
set_module_type(audiosrv win32cui UNICODE)
add_importlibs(audiosrv advapi32 user32 setupapi msvcrt kernel32)
add_importlibs(audiosrv advapi32 user32 setupapi msvcrt kernel32 ntdll)
add_pch(audiosrv audiosrv.h SOURCE)
add_cd_file(TARGET audiosrv DESTINATION reactos/system32 FOR all)

View file

@ -1,9 +1,8 @@
/*
* PROJECT: ReactOS
* LICENSE: GPL - See COPYING in the top level directory
* FILE: base/services/audiosrv/audiosrv.h
* PURPOSE: Audio Service (private header)
* COPYRIGHT: Copyright 2007 Andrew Greenwood
* PROJECT: ReactOS
* LICENSE: GPL - See COPYING in the top level directory
* PURPOSE: Audio Service (private header)
* COPYRIGHT: Copyright 2007 Andrew Greenwood
*/
#ifndef _AUDIOSRV_PCH_
@ -62,10 +61,6 @@ HandleDeviceEvent(
BOOL
StartSystemAudioServices(VOID);
/* Debugging */
void logmsg(char* string, ...);
#endif
#endif /* _AUDIOSRV_PCH_ */

View file

@ -16,23 +16,23 @@ Global\AudioDeviceList
This file appears to contain a list of devices that WinMM accesses and
subsequently passes to wdmaud.drv
It is not necessary to duplicate the exact structure of this mapped
It is not necessary to duplicate the exact structure of this mapped
file, since it appears to only be used internally by Windows components.
The ROS Audio Service (AudioSrv) is intended to be able to run
alongside the Windows Audio Service on XP/Vista, so it should be
The ROS Audio Service (AudioSrv) is intended to be able to run
alongside the Windows Audio Service on XP/Vista, so it should be
possible to test in a "known working environment" ;)
It will create a mutex, to:
1) Allow synchronization when accessing the device list
2) Provide a simple method of identifying if AudioSrv is running
(It might be worth using an event to notify WinMM when things are
(It might be worth using an event to notify WinMM when things are
happening?)
The intention is to make AudioSrv receive PnP notifications for
relevant audio devices, and also let AudioSrv in Windows do this. Then
it should be possible to create a small application that imitates
The intention is to make AudioSrv receive PnP notifications for
relevant audio devices, and also let AudioSrv in Windows do this. Then
it should be possible to create a small application that imitates
WinMM's actions :)

View file

@ -1,28 +0,0 @@
/* Service debugging (simply logs to a file) */
#include "audiosrv.h"
#include <stdio.h>
void logmsg(char* string, ...)
{
va_list args;
FILE* debug_file = fopen("c:\\audiosrv-debug.txt", "a");
if (debug_file)
{
va_start(args, string);
vfprintf(debug_file, string, args);
va_end(args);
fclose(debug_file);
}
else
{
char buf[256];
va_start(args, string);
vsprintf(buf, string, args);
OutputDebugStringA(buf);
va_end(args);
}
}

View file

@ -1,13 +1,15 @@
/*
* PROJECT: ReactOS
* LICENSE: GPL - See COPYING in the top level directory
* FILE: base/services/audiosrv/main.c
* PURPOSE: Audio Service
* COPYRIGHT: Copyright 2007 Andrew Greenwood
* PROJECT: ReactOS
* LICENSE: GPL - See COPYING in the top level directory
* PURPOSE: Audio Service
* COPYRIGHT: Copyright 2007 Andrew Greenwood
*/
#include "audiosrv.h"
#define NDEBUG
#include <debug.h>
SERVICE_STATUS_HANDLE service_status_handle;
SERVICE_STATUS service_status;
@ -34,19 +36,19 @@ ServiceControlHandler(
{
case SERVICE_CONTROL_INTERROGATE :
{
logmsg("* Interrogation\n");
DPRINT("* Interrogation\n");
return NO_ERROR;
}
case SERVICE_CONTROL_STOP :
case SERVICE_CONTROL_SHUTDOWN :
{
logmsg("* Service Stop/Shutdown request received\n");
DPRINT("* Service Stop/Shutdown request received\n");
logmsg("Unregistering device notifications\n");
DPRINT("Unregistering device notifications\n");
UnregisterDeviceNotifications();
logmsg("Destroying audio device list\n");
DPRINT("Destroying audio device list\n");
DestroyAudioDeviceList();
service_status.dwCurrentState = SERVICE_STOP_PENDING;
@ -57,14 +59,14 @@ ServiceControlHandler(
SetServiceStatus(service_status_handle, &service_status);
logmsg("* Service stopped\n");
DPRINT("* Service stopped\n");
return NO_ERROR;
}
case SERVICE_CONTROL_DEVICEEVENT :
{
logmsg("* Device Event\n");
DPRINT("* Device Event\n");
return HandleDeviceEvent(dwEventType, lpEventData);
}
@ -78,16 +80,16 @@ ServiceControlHandler(
VOID CALLBACK
ServiceMain(DWORD argc, LPWSTR argv)
{
logmsg("* Service starting\n");
logmsg("Registering service control handler...\n");
DPRINT("* Service starting\n");
DPRINT("Registering service control handler\n");
service_status_handle = RegisterServiceCtrlHandlerExW(SERVICE_NAME,
ServiceControlHandler,
NULL);
logmsg("Service status handle %d\n", service_status_handle);
DPRINT("Service status handle %d\n", service_status_handle);
if (!service_status_handle)
{
logmsg("Failed to register service control handler\n");
DPRINT("Failed to register service control handler\n");
/* FIXME - we should fail */
}
@ -103,23 +105,23 @@ ServiceMain(DWORD argc, LPWSTR argv)
service_status.dwCurrentState = SERVICE_START_PENDING;
SetServiceStatus(service_status_handle, &service_status);
logmsg("Creating audio device list\n");
DPRINT("Creating audio device list\n");
/* This creates the audio device list and mutex */
if (!CreateAudioDeviceList(AUDIO_LIST_MAX_SIZE))
{
logmsg("Failed to create audio device list\n");
DPRINT("Failed to create audio device list\n");
service_status.dwCurrentState = SERVICE_STOPPED;
service_status.dwWin32ExitCode = -1;
SetServiceStatus(service_status_handle, &service_status);
return;
}
logmsg("Registering for device notifications\n");
DPRINT("Registering for device notifications\n");
/* We want to know when devices are added/removed */
if (!RegisterForDeviceNotifications())
{
/* FIXME: This is not fatal at present as ROS does not support this */
logmsg("Failed to register for device notifications\n");
DPRINT("Failed to register for device notifications\n");
/*
DestroyAudioDeviceList();
@ -134,11 +136,11 @@ ServiceMain(DWORD argc, LPWSTR argv)
InitializeFakeDevice();
logmsg("Processing existing devices\n");
DPRINT("Processing existing devices\n");
/* Now find any devices that already exist on the system */
if (!ProcessExistingDevices())
{
logmsg("Could not process existing devices\n");
DPRINT("Could not process existing devices\n");
UnregisterDeviceNotifications();
DestroyAudioDeviceList();
@ -148,7 +150,7 @@ ServiceMain(DWORD argc, LPWSTR argv)
return;
}
logmsg("* Service started\n");
DPRINT("* Service started\n");
/* Tell SCM we are now running, and we may be stopped */
service_status.dwCurrentState = SERVICE_RUNNING;
service_status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
@ -163,9 +165,9 @@ int wmain(VOID)
{ NULL, NULL }
};
logmsg("Audio Service main()\n");
DPRINT("Audio Service main()\n");
if (!StartServiceCtrlDispatcherW(service_table))
logmsg("StartServiceCtrlDispatcher failed\n");
DPRINT("StartServiceCtrlDispatcher failed\n");
return 0;
}

View file

@ -1,9 +1,8 @@
/*
* PROJECT: ReactOS
* LICENSE: GPL - See COPYING in the top level directory
* FILE: base/services/audiosrv/pnp.c
* PURPOSE: Audio Service Plug and Play
* COPYRIGHT: Copyright 2007 Andrew Greenwood
* PROJECT: ReactOS
* LICENSE: GPL - See COPYING in the top level directory
* PURPOSE: Audio Service Plug and Play
* COPYRIGHT: Copyright 2007 Andrew Greenwood
*/
#include "audiosrv.h"
@ -15,6 +14,9 @@
#include <ks.h>
#include <ksmedia.h>
#define NDEBUG
#include <debug.h>
static HDEVNOTIFY device_notification_handle = NULL;
/*
@ -42,8 +44,6 @@ ProcessExistingDevices(VOID)
NULL,
NULL);
/* printf("%s:\n", ClassString); */
interface_data.cbSize = sizeof(interface_data);
interface_data.Reserved = 0;
@ -60,7 +60,7 @@ ProcessExistingDevices(VOID)
if ( ! detail_data )
{
logmsg("ProcessExistingDevices() failed to allocate detail_data\n");
DPRINT("failed to allocate detail_data\n");
return TRUE;
}
@ -143,7 +143,7 @@ RegisterForDeviceNotifications(VOID)
DEVICE_NOTIFY_ALL_INTERFACE_CLASSES*/);
if (!device_notification_handle)
{
logmsg("RegisterDeviceNotification() failed with error %d\n", GetLastError());
DPRINT("failed with error %d\n", GetLastError());
}
return ( device_notification_handle != NULL );

View file

@ -1,9 +1,8 @@
/*
* PROJECT: ReactOS
* LICENSE: GPL - See COPYING in the top level directory
* FILE: base/services/audiosrv/pnp_list_lock.c
* PURPOSE: Audio Service Plug and Play list locking mechanism
* COPYRIGHT: Copyright 2007 Andrew Greenwood
* PROJECT: ReactOS
* LICENSE: GPL - See COPYING in the top level directory
* PURPOSE: Audio Service Plug and Play list locking mechanism
* COPYRIGHT: Copyright 2007 Andrew Greenwood
*/
#include "audiosrv.h"

View file

@ -1,13 +1,15 @@
/*
* PROJECT: ReactOS
* LICENSE: GPL - See COPYING in the top level directory
* FILE: base/services/audiosrv/pnp_list_manager.c
* PURPOSE: Audio Service List Manager
* COPYRIGHT: Copyright 2007 Andrew Greenwood
* PROJECT: ReactOS
* LICENSE: GPL - See COPYING in the top level directory
* PURPOSE: Audio Service List Manager
* COPYRIGHT: Copyright 2007 Andrew Greenwood
*/
#include "audiosrv.h"
#define NDEBUG
#include <debug.h>
/*
Device descriptor
*/
@ -20,12 +22,10 @@ CreateDeviceDescriptor(WCHAR* path, BOOL is_enabled)
int path_length = WideStringSize(path);
int size = sizeof(PnP_AudioDevice) + path_length;
/* printf("path_length %d, total %d\n", path_length, size);*/
device = malloc(size);
if (! device)
{
logmsg("Failed to create a device descriptor (malloc fail)\n");
DPRINT("Failed to malloc device descriptor\n");
return NULL;
}
@ -64,18 +64,13 @@ AppendAudioDeviceToList(PnP_AudioDevice* device)
LockAudioDeviceList();
/*
printf("list size is %d\n", audio_device_list->size);
printf("device info size is %d bytes\n", device_info_size);
*/
/* We DON'T want to overshoot the end of the buffer! */
if (audio_device_list->size + device_info_size > audio_device_list->max_size)
{
/*printf("max_size would be exceeded! Failing...\n");*/
/*DPRINT("failed, max_size would be exceeded\n");*/
UnlockAudioDeviceList();
return FALSE;
}
@ -90,7 +85,7 @@ AppendAudioDeviceToList(PnP_AudioDevice* device)
UnlockAudioDeviceList();
logmsg("Device added to list\n");
DPRINT("Device added to list\n");
return TRUE;
}
@ -98,11 +93,9 @@ AppendAudioDeviceToList(PnP_AudioDevice* device)
BOOL
CreateAudioDeviceList(DWORD max_size)
{
/* printf("Initializing memory device list lock\n");*/
if (!InitializeAudioDeviceListLock())
{
/*printf("Failed!\n");*/
/*DPRINT("Failed\n");*/
return FALSE;
}
@ -111,7 +104,7 @@ CreateAudioDeviceList(DWORD max_size)
turning up before we're ready... */
LockAudioDeviceList();
logmsg("Creating file mapping\n");
DPRINT("Creating file mapping\n");
/* Expose our device list to the world */
device_list_file = CreateFileMappingW(INVALID_HANDLE_VALUE,
NULL,
@ -121,7 +114,7 @@ CreateAudioDeviceList(DWORD max_size)
AUDIO_LIST_NAME);
if (!device_list_file)
{
logmsg("Creation of audio device list failed (err %d)\n", GetLastError());
DPRINT("Creation of audio device list failed (err %d)\n", GetLastError());
UnlockAudioDeviceList();
KillAudioDeviceListLock();
@ -129,7 +122,7 @@ CreateAudioDeviceList(DWORD max_size)
return FALSE;
}
logmsg("Mapping view of file\n");
DPRINT("Mapping view of file\n");
/* Of course, we'll need to access the list ourselves */
audio_device_list = MapViewOfFile(device_list_file,
FILE_MAP_WRITE,
@ -138,7 +131,7 @@ CreateAudioDeviceList(DWORD max_size)
max_size);
if (!audio_device_list)
{
logmsg("MapViewOfFile FAILED (err %d)\n", GetLastError());
DPRINT("MapViewOfFile FAILED (err %d)\n", GetLastError());
CloseHandle(device_list_file);
device_list_file = NULL;
@ -159,7 +152,7 @@ CreateAudioDeviceList(DWORD max_size)
UnlockAudioDeviceList();
logmsg("Device list created\n");
DPRINT("Device list created\n");
return TRUE;
}
@ -167,20 +160,20 @@ CreateAudioDeviceList(DWORD max_size)
VOID
DestroyAudioDeviceList(VOID)
{
logmsg("Destroying device list\n");
DPRINT("Destroying device list\n");
LockAudioDeviceList();
/*printf("Unmapping view\n");*/
/*DPRINT("Unmapping view\n");*/
UnmapViewOfFile(audio_device_list);
audio_device_list = NULL;
/*printf("Closing memory mapped file\n");*/
/*DPRINT("Closing memory mapped file\n");*/
CloseHandle(device_list_file);
device_list_file = NULL;
UnlockAudioDeviceList();
/*printf("Killing devlist lock\n");*/
/*DPRINT("Killing devlist lock\n");*/
KillAudioDeviceListLock();
}

View file

@ -1,13 +1,15 @@
/*
* PROJECT: ReactOS
* LICENSE: GPL - See COPYING in the top level directory
* FILE: base/services/audiosrv/services.c
* PURPOSE: Audio Service Plug and Play
* COPYRIGHT: Copyright 2009 Johannes Anderwald
* PROJECT: ReactOS
* LICENSE: GPL - See COPYING in the top level directory
* PURPOSE: Audio Service Plug and Play
* COPYRIGHT: Copyright 2009 Johannes Anderwald
*/
#include "audiosrv.h"
#define NDEBUG
#include <debug.h>
BOOL
WaitForService(
SC_HANDLE hService,
@ -21,7 +23,7 @@ WaitForService(
{
if (!QueryServiceStatusEx(hService, SC_STATUS_PROCESS_INFO, (LPBYTE)&Info, sizeof(SERVICE_STATUS_PROCESS), &dwSize))
{
logmsg("QueryServiceStatusEx failed %x\n", GetLastError());
DPRINT("QueryServiceStatusEx failed %x\n", GetLastError());
break;
}
@ -32,7 +34,7 @@ WaitForService(
} while (Index++ < RetryCount);
logmsg("Timeout while waiting for service to become ready %p\n", hService);
DPRINT("Timeout while waiting for service to become ready %p\n", hService);
return FALSE;
}
@ -49,13 +51,13 @@ StartAudioService(
hService = OpenService(hSCManager, ServiceName, SERVICE_ALL_ACCESS);
if (!hService)
{
logmsg("Failed to open service %S %x\n", ServiceName, GetLastError());
DPRINT("Failed to open service %S %x\n", ServiceName, GetLastError());
return FALSE;
}
if (!StartService(hService, 0, NULL))
{
logmsg("Failed to start service %S %x\n", ServiceName, GetLastError());
DPRINT("Failed to start service %S %x\n", ServiceName, GetLastError());
CloseServiceHandle(hService);
return FALSE;
}
@ -71,18 +73,18 @@ StartSystemAudioServices(VOID)
{
SC_HANDLE hSCManager;
logmsg("Starting system audio services\n");
DPRINT("Starting system audio services\n");
hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
if (!hSCManager)
{
logmsg("Failed to open service manager %x\n", GetLastError());
DPRINT("Failed to open service manager %x\n", GetLastError());
return FALSE;
}
logmsg("Starting sysaudio service\n");
DPRINT("Starting sysaudio service\n");
StartAudioService(hSCManager, L"sysaudio", 20);
logmsg("Starting wdmaud service\n");
DPRINT("Starting wdmaud service\n");
StartAudioService(hSCManager, L"wdmaud", 20);
CloseServiceHandle(hSCManager);