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
17 CreateDeviceDescriptor(WCHAR
* path
, BOOL is_enabled
)
19 PnP_AudioDevice
* device
;
21 int path_length
= WideStringSize(path
);
22 int size
= sizeof(PnP_AudioDevice
) + path_length
;
24 /* printf("path_length %d, total %d\n", path_length, size);*/
26 device
= malloc(size
);
30 logmsg("Failed to create a device descriptor (malloc fail)\n");
34 device
->enabled
= is_enabled
;
35 memcpy(device
->path
, path
, path_length
);
42 Device list (manager-side)
44 The device list is stored in some shared-memory, with a named, global
45 mutex to provide a locking mechanism (to avoid it from being updated
49 static HANDLE device_list_file
= NULL
;
50 static PnP_AudioHeader
* audio_device_list
= NULL
;
54 TODO: Detect duplicate entries and ignore them! (In case we receive
55 a PnP event for an existing device...)
59 AppendAudioDeviceToList(PnP_AudioDevice
* device
)
63 /* Figure out the actual structure size */
64 device_info_size
= sizeof(PnP_AudioDevice
);
65 device_info_size
+= WideStringSize(device
->path
);
67 LockAudioDeviceList();
70 printf("list size is %d\n", audio_device_list->size);
71 printf("device info size is %d bytes\n", device_info_size);
74 /* We DON'T want to overshoot the end of the buffer! */
75 if ( audio_device_list
->size
+ device_info_size
> audio_device_list
->max_size
)
77 /*printf("max_size would be exceeded! Failing...\n");*/
79 UnlockAudioDeviceList();
84 /* Commit the device descriptor to the list */
85 memcpy((char*)audio_device_list
+ audio_device_list
->size
,
89 /* Update the header */
90 audio_device_list
->device_count
++;
91 audio_device_list
->size
+= device_info_size
;
93 UnlockAudioDeviceList();
95 logmsg("Device added to list\n");
101 CreateAudioDeviceList(DWORD max_size
)
103 /* printf("Initializing memory device list lock\n");*/
105 if ( ! InitializeAudioDeviceListLock() )
107 /*printf("Failed!\n");*/
111 /* Preliminary locking - the list memory will likely be a big
112 buffer of gibberish at this point so we don't want anyone
113 turning up before we're ready... */
114 LockAudioDeviceList();
116 logmsg("Creating file mapping\n");
117 /* Expose our device list to the world */
118 device_list_file
= CreateFileMappingW(INVALID_HANDLE_VALUE
,
125 if ( ! device_list_file
)
127 logmsg("Creation of audio device list failed (err %d)\n", GetLastError());
129 UnlockAudioDeviceList();
130 KillAudioDeviceListLock();
135 logmsg("Mapping view of file\n");
136 /* Of course, we'll need to access the list ourselves */
137 audio_device_list
= MapViewOfFile(device_list_file
,
143 if ( ! audio_device_list
)
145 logmsg("MapViewOfFile FAILED (err %d)\n", GetLastError());
147 CloseHandle(device_list_file
);
148 device_list_file
= NULL
;
150 UnlockAudioDeviceList();
151 KillAudioDeviceListLock();
156 /* Clear the mem to avoid any random stray data */
157 memset(audio_device_list
, 0, max_size
);
159 /* Don't want devices to overwrite the list! */
160 audio_device_list
->size
= sizeof(PnP_AudioHeader
);
161 audio_device_list
->max_size
= max_size
;
162 audio_device_list
->device_count
= 0;
164 UnlockAudioDeviceList();
166 logmsg("Device list created\n");
172 DestroyAudioDeviceList()
174 logmsg("Destroying device list\n");
176 LockAudioDeviceList();
178 /*printf("Unmapping view\n");*/
179 UnmapViewOfFile(audio_device_list
);
180 audio_device_list
= NULL
;
182 /*printf("Closing memory mapped file\n");*/
183 CloseHandle(device_list_file
);
184 device_list_file
= NULL
;
186 UnlockAudioDeviceList();
188 /*printf("Killing devlist lock\n");*/
189 KillAudioDeviceListLock();