| 
| 
 | Вопрос # 5 743/ вопрос решён / | 
 |  Здравствуйте, уважаемые эксперты!Пытаюсь написать генератор звуковых волн, но в начале хотел бы вывести кое какую информацию о звуковых адапторах. Нашол функции в MSDN:
 waveOutGetNumDevs и waveOutGetDevCaps.
 Функция  waveOutGetNumDevs работает как часы. Проверял отключая адапторы и службу Win. Audio, вставлял ещё один в PCI слот.
 А вот функция  waveOutGetDevCaps чудит, или чудит структура которую она заполняет. В частности, элемент структуры .szPname оказывается пустым, и прочие элементы структуры оказываются одинаковыми для двух адапторов, а вызываю я функцию столько раз сколько адапторов.
 Так как же получить информацию об адапторах?
 Приложение:Переключить в обычный режим procedure TForm1.FormShow(Sender: TObject);varAdapters: DWORD;DevInfo: PWaveOutCaps;Result, i: byte;begin     Memo1.Clear;     Label4.Caption:='';     Adapters:= waveOutGetNumDevs;     if Adapters = 0 then     begin       end;     if Adapters > 0 then     begin          Label3.Caption:= IntToStr(Adapters);          For i:= 1 to Adapters do          begin               waveOutGetDevCaps(i, DevInfo, 0);                Memo1.Lines.Add(DevInfo.szPname);               Memo1.Lines.Add('');            end;     end;  end; 
Примечание #1 (13 ноября 2011, 10:35): Второй день ковыряюсь, сил уже нету.Я в начале пробовал через DirectSoundEnumerate,
 но там не смог справиться с ошибкой. Уже точно не помню текст ошибки, а смысл был в том что есть какая то проблема при подключении к DSound.dll
 
 
|  |   Вопрос задал: QWERYTY (статус: Посетитель)Вопрос отправлен: 13 ноября 2011, 10:21
 Состояние вопроса: решён, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 19; последнее сообщение — 30 декабря 2011, 22:51; участников в обсуждении: 3. 
|   | min@y™ (статус: Доктор наук), 13 ноября 2011, 10:46 [#1]:А где ж выделение памяти под структуру DevInfo? Это ж указатель, ёмоё. 
 { waveform output device capabilities structure }
type
  PWaveOutCapsA = ^TWaveOutCapsA;
  PWaveOutCapsW = ^TWaveOutCapsW;
  PWaveOutCaps = PWaveOutCapsA;Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | QWERYTY (статус: Посетитель), 13 ноября 2011, 11:15 [#2]:Спасибо вам, Минай. Вот в функции  waveOutGetDevCaps третьим параметром вроде как пишут указать размер структуры, а где его взять не пишут.
 Или он стандартный для любого адаптора?
 Я ещё не очень понимаю вот эту всю замуту с сылками, указателями, интерфейсами, и прочими сложностями.
 
 Не охото тупить, но видимо придётся. То что вы написали я читал в статьях по созданию проигрывателей, но на С, со всякими звёздочками и скобочками, вобщем ничерта не понял.
 Вот это надо добавить в первый же type в проекте?
 ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН. |  
|   | min@y™ (статус: Доктор наук), 13 ноября 2011, 11:34 [#3]: Цитата (QWERYTY): Вот это надо добавить в первый же type в проекте?  Нет, это я процитировал кусок модуля mmsystem.pas.
 
 Цитата (QWERYTY): третьим параметром вроде как пишут указать размер структуры, а где его взять не пишут. Оператор SizeOf() ещё никто не отменял. Однако, нужно оперировать не с указателем (4 байта), а с самой структурой. Можно, конечно, поклянчить под неё память динамически, но проще пользоваться простой статической переменной, а в функцию передавать её адрес. Примерно как-то так:
 
 var
...
  DevInfo: TWaveOutCapsA;
...
begin
...
  // waveOutGetDevCaps(i, &DevInfo, sizeof(DevInfo)); // <--- C++
  waveOutGetDevCaps(i, @DevInfo, SizeOf(DevInfo)); // delphi 
...
end; Цитата (QWERYTY): Я ещё не очень понимаю вот эту всю замуту с сылками, указателями, интерфейсами, и прочими сложностями.  Очень рекомендую подучить. В жизни пригодится.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | QWERYTY (статус: Посетитель), 13 ноября 2011, 12:20 [#4]:Спасибо вам, Минай. Заработало. Только адаптор находится один, и что меня поразило ещё больше, не тот который активный в данный момент. Но тут уж как нибудь разберусь. 
 Для тех кто будет читать, дочитает до предыдущего поста, пойдёт делать, а потом вернётся читать дальше:
 &DevInfo - вот тут не енд, а собака.
 Этот пароль я подобрал методом эвристического подбора ключей.
   ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН. |  
|   | QWERYTY (статус: Посетитель), 13 ноября 2011, 12:24 [#5]:Плюс вам, Минай. Я думаю это справедливо, вы действительно помогли. ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН. |  13 ноября 2011, 12:27: Статус вопроса изменён на решённый (изменил автор вопроса — QWERYTY) 
|   | min@y™ (статус: Доктор наук), 13 ноября 2011, 12:27 [#6]: Цитата (QWERYTY): Только адаптор находится один, и что меня поразило ещё больше, не тот который активный в данный момент. А может они с нуля нумеруются, а не с 1?
 
 Цитата (QWERYTY): &DevInfo - вот тут не енд, а собака.  Бляхамуха, точно. Это у меня сишник с паскалем в башке перемешались.
 
 Цитата (QWERYTY): Плюс вам, Минай. Я думаю это справедливо, вы действительно помогли.  От плюса не откажусь.
   Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | QWERYTY (статус: Посетитель), 13 ноября 2011, 12:44 [#7]:Мля, как же теперь быть, придётся выкручиваться? Чё за морока едрён батон. Функция которая возвращает количество передаёт 0 когда ошибка, а дальше по очереди от однёрки и дальше. А функция которая заполняет структуру счёт ведёт с нуля, как я понимаю. Придётся гневное письмо Биллу писать.
  
 Видимо так:
 .....
 .....
 For i:= 0 to Adapters-1 do
 begin
 waveOutGetDevCaps(i, @DevInfo, SizeOf(DevInfo));
 Memo1.Lines.Add('Адаптор №'+IntToStr(i+1)+':');
 .....
 .....
 ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН. |  
|   | min@y™ (статус: Доктор наук), 13 ноября 2011, 12:51 [#8]:Чо, я опять угадал? Было несложно, ибо в цифровой технике ВСЁ считается с нуля! Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | QWERYTY (статус: Посетитель), 13 ноября 2011, 13:27 [#9]:Ну всё, вторая функция заработала как часы. Извлёк:
 
 Адаптор №1:
 C-Media Wave Device(Встроенная говняшка, это очень мешало в проверке промежуточных результатов)
 
 Адаптор №2:
 Aureal Audio(Цивильный в своё время, полноценный микшер, со всякими феньками и собственными ауреаловскими технологиями)
 ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН. |  
|   | QWERYTY (статус: Посетитель), 13 ноября 2011, 14:03 [#10]:Кстати у ауреала подключение странное, слава богу функции на это не купились. 
 Там в общем получается что к PCI цепляется чип
 Multifunction PCI Parent, а к нему звуковой Aureal чип и к нему же игровой порт.
 А C-Media сразу цепляется к PCI и уже к нему подключен игровой порт.
 ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН. |  
|   | bugmenot (статус: 3-ий класс), 13 ноября 2011, 18:33 [#11]:ха, опять виконання програми розпочинається з того самого мiсця, де призупинилося.
 
 |  
|   | QWERYTY (статус: Посетитель), 14 ноября 2011, 02:19 [#12]:Здравствуйте Багменот! Что значит ха? И что значит опять?
 
 Багменот, не подскажите при помощи mmsystem можно раскачать аудиоадаптер на всю катушку(ну в смысле чтоб я мог закодить и 16гц. и 20000гц и в этом интервале чтоб плавно менять частоты без падения качества).
 Скачивал проекты подобных вещей, но там одна прога не позволяет регулировать частоты(там пару положений выбираешь радиобатоном), а вторая даёт ужасные результаты. Там чистый выход не на всей шкале от 200 - 20000гц. И человеческое ухо на этом диапазоне не плохой инструмент. Например там отчётливо слышно что 16800гц грубже звучит чем 11600гц.
 Усилитель специально использую 20 - 20000гц, отключил всякую лабуду от компа(типа активных 4-ёх ватных).
 ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН. |  
|   | QWERYTY (статус: Посетитель), 14 ноября 2011, 04:17 [#13]:Ну мля, опять пошли траблы. Элемент структуры .wChannels почемуто указывает не 1 или 2 как везде пишут, а 65535 для обоих адаптеров. Теперь придётся покупать новую акустическую систему  65535.1 TwinBass XBass SuperBass. 
 И я вынужден задать вопрос:
 Нормально ли это?
 ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН. |  
|   | QWERYTY (статус: Посетитель), 14 ноября 2011, 06:25 [#14]:Ну ахренеть. Я думал функции извлекают данные о адапторах в последовательности как они их находят в шинах PCI. Начал было уже писать код для отображения номера активного адаптора. Но тут начались чудеса. Активный адаптор всегда отображается первым в списке где я их перечисляю.
 
 Я думал что функции из mmsystem которыми я пользуюсь вызывают(если нужно) другие функции, которые считывают инфу непосредственно из чипов адапторов(класс то известен). Но видимо они берут инфу где угодно, только не с чипов.
 ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН. |  
|   | QWERYTY (статус: Посетитель), 14 ноября 2011, 08:44 [#15]:А ёще не получается получить hwo адапторов. Делаю так:
 ....
 ....
 var
 HWO: DWORD;
 Fmt: TWAVEFORMAT;
 begin
 waveOutOpen(@HWO, 0, @Fmt, 0, 0, CALLBACK_NULL);// для первого
 end;
 
 В итоге HWO оказывается 0.
 И в MSDN я функций для извлечения HWO не нашол, хотя это странно, он там везде нужен.
 ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН. |  
|   | bugmenot (статус: 3-ий класс), 14 ноября 2011, 11:45 [#16]: Цитата (QWERYTY): Что значит ха? И что значит опять? Сколько раз нужно повторять про проверку результатов чтобы дошло?
 виконання програми розпочинається з того самого мiсця, де призупинилося.
 
 |  
|   | QWERYTY (статус: Посетитель), 16 ноября 2011, 02:24 [#17]:Вы про ласт еррор, где ошибка подключения длл? Я посчитал что не буду с этим возиться, там сразу пошло по галимому. Пришлось качать библиотеку с заголовочным файлом DirectSound.pas, в других примерах писали подключаем DirectX, но у меня так вообще не компилировалось. Ну получил бы я информацию об ошибке, а дальше что. Если длл не было то я не собираюсь ради проги устанавливать длл-ки взятые хрен знает откуда. А если траблы в DirectSound.pas то исправлять их я тоже не собираюсь.
 Должно быть как-то проще(ну например как с mmsystem, подключаем и пишем).
 
 Вы бы лучше подсказали как добыть HWO. waveOutGetNumDevs и waveOutGetDevCaps его не извлекают, а в остальных он нужен.
 ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН. |  
|   | QWERYTY (статус: Посетитель), 16 ноября 2011, 04:55 [#18]:Уродство какое-то, они не могли написать функцию по типу waveOutGetID(только waveOutGetHandle). И выглядело бы это примерно так: MMRESULT waveOutGetHandle(LPUINT puDeviceID, HWAVEOUT hwo);
 
 Функция waveOutOpen начала извлекать хендл, но он один на 2-а адаптора, и подозрительно короткий. Извлекаю так:
 
 procedure TForm1.FormCreate(Sender: TObject);
var
HWO: HWAVEOUT;
Fmt: TWAVEFORMATEX;
begin
     Fmt.wFormatTag:= 1; // PCM
     Fmt.nChannels:= 2;
     Fmt.nBlockAlign:= 2* Fmt.nChannels;
     Fmt.wBitsPerSample:= 16;
     Fmt.nSamplesPerSec:= 10;
     Fmt.nAvgBytesPerSec:= Fmt.nSamplesPerSec * Fmt.nBlockAlign;
     Fmt.cbSize:= SizeOf(Fmt);
     waveOutOpen(@HWO, 0, @Fmt, 0, 0, WAVE_FORMAT_QUERY);
     Edit1.Text:= IntToStr(HWO);
end;ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН. |  
|   | QWERYTY (статус: Посетитель), 30 декабря 2011, 22:51 [#19]:А вот и извлекли HWO всех установленных адапторов. 
 
 procedure TForm1.FormCreate(Sender: TObject);
var
HWO: HWAVEOUT;
Fmt: TWAVEFORMATEX;
Adapters, i: Byte;
AdaptersHandle: Array[0..31] of HWAVEOUT;
 
begin
     Adapters:= waveOutGetNumDevs;
     with Fmt do
     begin
          wFormatTag:= WAVE_FORMAT_PCM;
          nChannels:= 1;
          nSamplesPerSec:= 44100;
          wBitsPerSample:= 16;
          nBlockAlign:= nChannels * (wBitsPerSample div 8);
          nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;
          cbSize:= 0;
     end;
     For i:= 0 to Adapters-1 do
     begin
          waveOutOpen(addr(HWO), i, @Fmt, Handle, 0, CALLBACK_WINDOW);
          AdaptersHandle[i]:= HWO;
          waveOutClose(HWO);
          HWO:= 0;
     end;
end;ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |