Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Получение списка аудиоустройств


Автор: Erigity 13.2.2010, 09:40
Как в WinXP получить список воспроизводящих звук аудиоустройств?
В идеале - все те устройства, которые отображаются в Панель Управления->Звуки и аудиоустройства->Аудио->Воспроизведение звука.
Понятно, что они хранятся в реестре, но найти их там, я не нашел smile Вернее, нашел что-то похожее вроде бы в CurrentControlSet, но там всё в кучу и много мусора smile
В интернете тоже пусто :(

upd:Нашел что-то похожее на правду по адресу: HKEY_CURRENT_USER\Software\Microsoft\ActiveMovie\devenum\{33D9A762-90C8-11D0-BD43-00A0C911CE86}
Проверьте, кому не лень, действительно ли там воспроизводящие устройства, или это у меня совпадение smile  И такой ли путь(просто {33D9A762-90C8-11D0-BD43-00A0C911CE86} смущает(вдруг оно непостоянное и от чего-то зависит))

upd2: Хм.. ошибочка) там записывающие девайсы)
Воспроизводящие тут: HKEY_CURRENT_USER\Software\Microsoft\ActiveMovie\devenum\{E0F158E1-CB04-11D0-BD4E-00A0C911CE86}
Т.е., насколько я понимаю, исключением Default DirectSound DeviceDefault WaveOut Device и устройств с префиксом DirectSound: получаем нужный список?smile 

Все же хотелось бы получить более общую инфу с разных машинок  smile 

Автор: Snowy 15.2.2010, 16:19
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\MEDIA

Автор: Erigity 16.2.2010, 07:44
Цитата(Snowy @ 15.2.2010,  16:19)
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\MEDIA

Спасибо, но это не совсем то, что требовалось) Мне нужны были именно названия устройств вроде Logitech USB Headset, поскольку заменой ключа Playback по адресу HKEY_CURRENT_USER\Software\Microsoft\Multimedia\Sound Mapper на название устройства можно заменять текущее воспроизводящее smile 

Автор: Snowy 16.2.2010, 11:35
Тогда нужно немного не так.
Код
var
  i, k: integer;
  w:    TWAVEOUTCAPS;
  n:    string;
begin
  k := waveOutGetNumDevs; // Device Count
  for i := 0 to k - 1 do
  begin
    FillChar(w, SizeOf(TWAVEOUTCAPS), #0);
    WaveOutGetDevCaps(i, @w, SizeOf(TWAVEOUTCAPS)); // GetDeviceInfo
    n := w.szPname; // DeviceName
    // Memo1.Lines.Add(n);
  end;
end;

Код выбирает только те устройства, которые можно назначить в качестве устройства вывода звука.
Вот только не уверен, что замена значения в реестре будет работать в висте или 7 с ограниченными правами...

Автор: Erigity 16.2.2010, 19:22
Спасибо smile Так действительно удобнее, чем реестр лопатить. 
Программу я для себя делал, так что насчет висты и семерки можно не волноваться, поскольку апгрейд еще не скоро, а железо уже не потянет smile 

И еще: насколько я успел заметить, в WinAPI нет функции для замены воспроизводящего устройства(по крайней мере, в mmsystem). Или я ошибаюсь?  smile

З.Ы.:
Код

WaveOutGetDevCaps(0, @w, SizeOf(TWAVEOUTCAPS)); // GetDeviceInfo

У вас очепятка. Первый параметр должен быть счетчиком цикла.  smile 

Автор: Snowy 17.2.2010, 16:13
Ага. Счётчик забыл... Но, имея мозг, не сложно догадаться smile
А что касается замены устройства - такое действие винда считает непозволительным.
Программа вправе выбирать только устройство, через которе будет воспроизводить она сама.
На другие программы влиять права не имеет.
Поэтому такого функционала не предусмотренно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)