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
16 CreateDeviceDescriptor(WCHAR
* path
, BOOL is_enabled
)
18 PnP_AudioDevice
* device
;
20 int path_length
= WideStringSize(path
);
21 int size
= sizeof(PnP_AudioDevice
) + path_length
;
23 /* printf("path_length %d, total %d\n", path_length, size);*/
25 device
= malloc(size
);
29 logmsg("Failed to create a device descriptor (malloc fail)\n");
33 device
->enabled
= is_enabled
;
34 memcpy(device
->path
, path
, path_length
);
41 Device list (manager-side)
43 The device list is stored in some shared-memory, with a named, global
44 mutex to provide a locking mechanism (to avoid it from being updated
48 static HANDLE device_list_file
= NULL
;
49 static PnP_AudioHeader
* audio_device_list
= NULL
;
53 TODO: Detect duplicate entries and ignore them! (In case we receive
54 a PnP event for an existing device...)
58 AppendAudioDeviceToList(PnP_AudioDevice
* device
)
62 /* Figure out the actual structure size */
63 device_info_size
= sizeof(PnP_AudioDevice
);
64 device_info_size
+= WideStringSize(device
->path
);
66 LockAudioDeviceList();
69 printf("list size is %d\n", audio_device_list->size);
70 printf("device info size is %d bytes\n", device_info_size);
73 /* We DON'T want to overshoot the end of the buffer! */
74 if ( audio_device_list
->size
+ device_info_size
> audio_device_list
->max_size
)
76 /*printf("max_size would be exceeded! Failing...\n");*/
78 UnlockAudioDeviceList();
83 /* Commit the device descriptor to the list */
84 memcpy((char*)audio_device_list
+ audio_device_list
->size
,
88 /* Update the header */
89 audio_device_list
->device_count
++;
90 audio_device_list
->size
+= device_info_size
;
92 UnlockAudioDeviceList();
94 logmsg("Device added to list\n");
100 CreateAudioDeviceList(DWORD max_size
)
102 /* printf("Initializing memory device list lock\n");*/
104 if ( ! InitializeAudioDeviceListLock() )
106 /*printf("Failed!\n");*/
110 /* Preliminary locking - the list memory will likely be a big
111 buffer of gibberish at this point so we don't want anyone
112 turning up before we're ready... */
113 LockAudioDeviceList();
115 logmsg("Creating file mapping\n");
116 /* Expose our device list to the world */
117 device_list_file
= CreateFileMappingW(INVALID_HANDLE_VALUE
,
124 if ( ! device_list_file
)
126 logmsg("Creation of audio device list failed (err %d)\n", GetLastError());
128 UnlockAudioDeviceList();
129 KillAudioDeviceListLock();
134 logmsg("Mapping view of file\n");
135 /* Of course, we'll need to access the list ourselves */
136 audio_device_list
= MapViewOfFile(device_list_file
,
142 if ( ! audio_device_list
)
144 logmsg("MapViewOfFile FAILED (err %d)\n", GetLastError());
146 CloseHandle(device_list_file
);
147 device_list_file
= NULL
;
149 UnlockAudioDeviceList();
150 KillAudioDeviceListLock();
155 /* Clear the mem to avoid any random stray data */
156 memset(audio_device_list
, 0, max_size
);
158 /* Don't want devices to overwrite the list! */
159 audio_device_list
->size
= sizeof(PnP_AudioHeader
);
160 audio_device_list
->max_size
= max_size
;
161 audio_device_list
->device_count
= 0;
163 UnlockAudioDeviceList();
165 logmsg("Device list created\n");
171 DestroyAudioDeviceList()
173 logmsg("Destroying device list\n");
175 LockAudioDeviceList();
177 /*printf("Unmapping view\n");*/
178 UnmapViewOfFile(audio_device_list
);
179 audio_device_list
= NULL
;
181 /*printf("Closing memory mapped file\n");*/
182 CloseHandle(device_list_file
);
183 device_list_file
= NULL
;
185 UnlockAudioDeviceList();
187 /*printf("Killing devlist lock\n");*/
188 KillAudioDeviceListLock();