3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/services/audiosrv/pnp_list_manager.c
5 * PURPOSE: Audio Service List Manager
6 * COPYRIGHT: Copyright 2007 Andrew Greenwood
11 #include <audiosrv/audiosrv.h>
20 CreateDeviceDescriptor(WCHAR
* path
, BOOL is_enabled
)
22 PnP_AudioDevice
* device
;
24 int path_length
= WideStringSize(path
);
25 int size
= sizeof(PnP_AudioDevice
) + path_length
;
27 /* printf("path_length %d, total %d\n", path_length, size);*/
29 device
= malloc(size
);
33 logmsg("Failed to create a device descriptor (malloc fail)\n");
37 device
->enabled
= is_enabled
;
38 memcpy(device
->path
, path
, path_length
);
45 Device list (manager-side)
47 The device list is stored in some shared-memory, with a named, global
48 mutex to provide a locking mechanism (to avoid it from being updated
52 static HANDLE device_list_file
= NULL
;
53 static PnP_AudioHeader
* audio_device_list
= NULL
;
57 TODO: Detect duplicate entries and ignore them! (In case we receive
58 a PnP event for an existing device...)
62 AppendAudioDeviceToList(PnP_AudioDevice
* device
)
66 /* Figure out the actual structure size */
67 device_info_size
= sizeof(PnP_AudioDevice
);
68 device_info_size
+= WideStringSize(device
->path
);
70 LockAudioDeviceList();
73 printf("list size is %d\n", audio_device_list->size);
74 printf("device info size is %d bytes\n", device_info_size);
77 /* We DON'T want to overshoot the end of the buffer! */
78 if ( audio_device_list
->size
+ device_info_size
> audio_device_list
->max_size
)
80 /*printf("max_size would be exceeded! Failing...\n");*/
82 UnlockAudioDeviceList();
87 /* Commit the device descriptor to the list */
88 memcpy((char*)audio_device_list
+ audio_device_list
->size
,
92 /* Update the header */
93 audio_device_list
->device_count
++;
94 audio_device_list
->size
+= device_info_size
;
96 UnlockAudioDeviceList();
98 logmsg("Device added to list\n");
104 CreateAudioDeviceList(DWORD max_size
)
106 /* printf("Initializing memory device list lock\n");*/
108 if ( ! InitializeAudioDeviceListLock() )
110 /*printf("Failed!\n");*/
114 /* Preliminary locking - the list memory will likely be a big
115 buffer of gibberish at this point so we don't want anyone
116 turning up before we're ready... */
117 LockAudioDeviceList();
119 logmsg("Creating file mapping\n");
120 /* Expose our device list to the world */
121 device_list_file
= CreateFileMappingW(INVALID_HANDLE_VALUE
,
128 if ( ! device_list_file
)
130 logmsg("Creation of audio device list failed (err %d)\n", GetLastError());
132 UnlockAudioDeviceList();
133 KillAudioDeviceListLock();
138 logmsg("Mapping view of file\n");
139 /* Of course, we'll need to access the list ourselves */
140 audio_device_list
= MapViewOfFile(device_list_file
,
146 if ( ! audio_device_list
)
148 logmsg("MapViewOfFile FAILED (err %d)\n", GetLastError());
150 CloseHandle(device_list_file
);
151 device_list_file
= NULL
;
153 UnlockAudioDeviceList();
154 KillAudioDeviceListLock();
159 /* Clear the mem to avoid any random stray data */
160 memset(audio_device_list
, 0, max_size
);
162 /* Don't want devices to overwrite the list! */
163 audio_device_list
->size
= sizeof(PnP_AudioHeader
);
164 audio_device_list
->max_size
= max_size
;
165 audio_device_list
->device_count
= 0;
167 UnlockAudioDeviceList();
169 logmsg("Device list created\n");
175 DestroyAudioDeviceList()
177 logmsg("Destroying device list\n");
179 LockAudioDeviceList();
181 /*printf("Unmapping view\n");*/
182 UnmapViewOfFile(audio_device_list
);
183 audio_device_list
= NULL
;
185 /*printf("Closing memory mapped file\n");*/
186 CloseHandle(device_list_file
);
187 device_list_file
= NULL
;
189 UnlockAudioDeviceList();
191 /*printf("Killing devlist lock\n");*/
192 KillAudioDeviceListLock();