Board.KolibriOS.org https://board.kolibrios.org/ |
|
System audio mixer https://board.kolibrios.org/viewtopic.php?f=38&t=1488 |
Page 1 of 3 |
Author: | Asper [ Tue Aug 17, 2010 11:28 pm ] | ||
Post subject: | System audio mixer | ||
Простой системный аудиомикшер. Вообще-то писался под драйвер HDA, но сделал также поддержку AC97 драйверов. Из AC97 тестировался только на EMU10K1X, так, что если найдёте ошибку сообщайте. Внимание корректно работает только с самыми последними версиями драйвера HDA, не старше 15 августа этого года! Для HDA есть возможность отдельно регулировать громкость правого и левого канала. Для регулировки левого канала - Home/End, правого - PageUp/PageDown. Для AC97 возможно регулировать только оба канала одновременно, т.е. уровень звучания в обоих каналах будет одинаковый.
|
Author: | Serge [ Wed Aug 18, 2010 9:32 am ] |
Post subject: | Re: System audio mixer |
Asper Уровень громкости задаётся как в DirectSound: ослабление сигнала в сотых db от 0db до -100db. Конвертировать уровень в формат кодека должен драйвер, а не прикладной софт. |
Author: | Asper [ Wed Aug 18, 2010 1:03 pm ] |
Post subject: | Re: System audio mixer |
Serge wrote: Asper Уровень громкости задаётся как в DirectSound: ослабление сигнала в сотых db от 0db до -100db. Конвертировать уровень в формат кодека должен драйвер, а не прикладной софт. Для AC97 да от 0 до -100, для HDA из установок виджета. Не понял, в чем вопрос, вроде бы сейчас для AC97 драйверов уровень громкости задается именно в децибеллах. ЧЯДНТ? |
Author: | Serge [ Wed Aug 18, 2010 2:32 pm ] |
Post subject: | Re: System audio mixer |
Asper Quote: вроде бы сейчас для AC97 драйверов уровень громкости задается именно в децибеллах И для SB16.1.Мне не нравится идея пересчитывать уровни из db в фиксированные шаги. Тем более что в последних кодеках АС97 было не 5 а 6 бит на громкость (ALC658 - один из самых распространненых), у SBPro их 4, а у SB16 8. Лучше оперировать уровнями в децибелах. А точное значение получать парой SetMasterVol/GetMasterVol. 2.Формат вызовов DEV_GET_MASTERVOL и DEV_SET_MASTERVOL в новом драйвере изменён, что приводит к несовместимости. |
Author: | Asper [ Wed Aug 18, 2010 2:42 pm ] |
Post subject: | Re: System audio mixer |
А как ты представляешь установку 10000 значений? Quote: А точное значение получать парой SetMasterVol/GetMasterVol. Так и делается. Quote: 2.Формат вызовов DEV_GET_MASTERVOL и DEV_SET_MASTERVOL в новом драйвере изменён, что приводит к несовместимости. А можно подробнее? |
Author: | Serge [ Wed Aug 18, 2010 4:13 pm ] |
Post subject: | Re: System audio mixer |
10 000 и не получится. Уровни ниже -60 db должно быть одинаково неслышно на всех кодеках. Сделать ползунок на 10 000 позиций тоже проблематично. В любом случае финальная конвертация уровня из db в формат чипа дело драйвера, а не прикладного софта. В вызове SOUND.DEV_SET_MASTERVOL уровень передаётся в децибелах как знаковое целое 32 бита. В твоей программе в виде упакованной структуры где старшие 8 бит - номер канала а младшие 24 уровень в шагах кодека. Разный формат параметров для одного вызова очень неудачная идея. Вызов SRV_GETVERSION возвращает текущую версию SOUND.API в младшем слове и минимальную совместимую в старшем. Изменение версии API с 1.00 (0х0100) до 17.218 (0x11DA) выглядит слишком большим. |
Author: | Asper [ Wed Aug 18, 2010 7:21 pm ] |
Post subject: | Re: System audio mixer |
Всё теперь понял. Хм... а всё-таки регулировка отдельно правого и левого канала мне показалась интересной, может сделать под это дело дополнительный вызов драйвера? Кстати для AC97 кодеков в принципе можно отдельно регулировать каналы или нет? DEV_GET_INFO тоже стандартизован? |
Author: | Serge [ Wed Aug 18, 2010 8:46 pm ] |
Post subject: | Re: System audio mixer |
Asper Раньше DEV_GET_INFO возвращала данные в формате Code: struc CTRL_INFOСейчас этот вызов остался только в Emu10k1x.asm, в приложениях он не используется. Я думаю что лучше всего дополнить структуру необходимыми полями. Драйвер будет определять версию по размеру структуры в вызове DEV_GET_INFO, а приложение по версии SOUND.API. Quote: а всё-таки регулировка отдельно правого и левого канала мне показалась интересной, может сделать под это дело дополнительный вызов драйвера? Кстати для AC97 кодеков в принципе можно отдельно регулировать каналы или нет? Да, такая регулировка есть.Я не знаю есть ли сейчас программы напрямую устанавливающие громкость кодека. Раньше это был плеер, но теперь в Infinity уровни устанавливаются отдельно для каждого звукового буфера. ИМХО лучший вариант добавить новые вызовы, сохранив совместимость с уже существующими. В этом случае в драйвере надо прописать Code: CURRENT_API equ 0x0200 ;2.00 |
Author: | Asper [ Thu Aug 19, 2010 8:01 am ] |
Post subject: | Re: System audio mixer |
Нашёл у себя на компьютере документацию на AC97 кодеки AC97ComponentSpecificationv2.1.pdf, которую я скачивал когда-то давно вместе с другой хардварной документацией. Так вот в ней прочитал про формат регистра master volume [mute:1][0:1][right channel:6][0:2][left channel:6]. Максимум 63 Дб. В вызове SET_MASTER_VOLUME ты проверяешь устанавливаемое значение на границы и затем это значение копируешь и в al и в ah, т.е. отдельная установка каналов теряется на уровне этой функции. Если делать новую версию драйверов, то не проще ли сразу изменить формат SET_MASTER_VOLUME для установки каналов отдельно, а не делать новый вызов, который по большей части будет дублировать данный? Да это приведёт к несовместимости с текущими программами выводящими звук и использующими этот вызов, но даже если такие есть (врядли) то их немного, можно их поправить. То же касается вызова GET_MASTER_VOLUME. В общем для чего сохранять совместимость не понимаю. |
Author: | Asper [ Thu Aug 19, 2010 8:14 am ] |
Post subject: | Re: System audio mixer |
Насчёт DEV_GET_INFO я его использовал некоторое время для отладки, а так в приложениях да пока не был задействован. Я просто думал использовать его в HDA драйвере для возвращения данных из переменной spec типа HDA_GSPEC, это позволило бы например программе определять к каким портам какие устройства подключены и другую полезную информацию о имеющихся нодах. Но т.к. в AC97 такой информации нет, то делать отдельный вызов что ли? |
Author: | Serge [ Thu Aug 19, 2010 11:08 am ] |
Post subject: | Re: System audio mixer |
Asper Большевики сами создают себе трудности, которые успешно преодолевают. Править придётся не только программы но и все драйверы. Зачем на ровном месте создавать несовместимость с уже существующим API, когда достаточно двух новых ioctl SET_CHANNEL_VOLUME и GET_CHANNEL_VOLUME ? |
Author: | Asper [ Thu Aug 19, 2010 8:00 pm ] |
Post subject: | Re: System audio mixer |
![]() Ок. Номера новых вызовов и формат? |
Author: | Serge [ Sun Aug 22, 2010 8:32 am ] |
Post subject: | Re: System audio mixer |
SET_CHANNEL_VOLUME equ 9 GET_CHANNEL_VOLUME equ 10 формат: номер канала, уровень в -db. Дополнительно можно сделать пакетный вызов для обработки всех каналов сразу. Передавать битовую карту каналов и за ней массив уровней. Данные лучше не паковать и передавать как dword. Экономия памяти минимальна, больше возни. |
Author: | Asper [ Sun Aug 22, 2010 8:15 pm ] |
Post subject: | Re: System audio mixer |
Спасибо, примерно так я это себе и представлял. |
Author: | Mario [ Sat Apr 21, 2012 6:35 pm ] |
Post subject: | Re: System audio mixer |
Почти два года прошло, а общесистемного микшера так и нет. |
Page 1 of 3 | All times are UTC+03:00 |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |