Page 1 of 3

System audio mixer

Posted: Tue Aug 17, 2010 11:28 pm
by Asper
Простой системный аудиомикшер. Вообще-то писался под драйвер HDA, но сделал также поддержку AC97 драйверов. Из AC97 тестировался только на EMU10K1X, так, что если найдёте ошибку сообщайте.
Внимание корректно работает только с самыми последними версиями драйвера HDA, не старше 15 августа этого года!

Для HDA есть возможность отдельно регулировать громкость правого и левого канала.
Для регулировки левого канала - Home/End, правого - PageUp/PageDown.
Для AC97 возможно регулировать только оба канала одновременно, т.е. уровень звучания в обоих каналах будет одинаковый.

Re: System audio mixer

Posted: Wed Aug 18, 2010 9:32 am
by Serge
Asper

Уровень громкости задаётся как в DirectSound: ослабление сигнала в сотых db от 0db до -100db. Конвертировать уровень в формат кодека должен драйвер, а не прикладной софт.

Re: System audio mixer

Posted: Wed Aug 18, 2010 1:03 pm
by Asper
Serge wrote:Asper

Уровень громкости задаётся как в DirectSound: ослабление сигнала в сотых db от 0db до -100db. Конвертировать уровень в формат кодека должен драйвер, а не прикладной софт.
Для AC97 да от 0 до -100, для HDA из установок виджета. Не понял, в чем вопрос, вроде бы сейчас для AC97 драйверов уровень громкости задается именно в децибеллах. ЧЯДНТ?

Re: System audio mixer

Posted: Wed Aug 18, 2010 2:32 pm
by Serge
Asper
вроде бы сейчас для AC97 драйверов уровень громкости задается именно в децибеллах
И для SB16.

1.Мне не нравится идея пересчитывать уровни из db в фиксированные шаги. Тем более что в последних кодеках АС97 было не 5 а 6 бит на громкость (ALC658 - один из самых распространненых), у SBPro их 4, а у SB16 8.

Лучше оперировать уровнями в децибелах. А точное значение получать парой SetMasterVol/GetMasterVol.

2.Формат вызовов DEV_GET_MASTERVOL и DEV_SET_MASTERVOL в новом драйвере изменён, что приводит к несовместимости.

Re: System audio mixer

Posted: Wed Aug 18, 2010 2:42 pm
by Asper
А как ты представляешь установку 10000 значений?
А точное значение получать парой SetMasterVol/GetMasterVol.
Так и делается.
2.Формат вызовов DEV_GET_MASTERVOL и DEV_SET_MASTERVOL в новом драйвере изменён, что приводит к несовместимости.
А можно подробнее?

Re: System audio mixer

Posted: Wed Aug 18, 2010 4:13 pm
by Serge
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) выглядит слишком большим.

Re: System audio mixer

Posted: Wed Aug 18, 2010 7:21 pm
by Asper
Всё теперь понял.
Хм... а всё-таки регулировка отдельно правого и левого канала мне показалась интересной, может сделать под это дело дополнительный вызов драйвера? Кстати для AC97 кодеков в принципе можно отдельно регулировать каналы или нет?
DEV_GET_INFO тоже стандартизован?

Re: System audio mixer

Posted: Wed Aug 18, 2010 8:46 pm
by Serge
Asper

Раньше DEV_GET_INFO возвращала данные в формате

Code: Select all

struc CTRL_INFO
{   .pci_cmd	      dd ?
    .irq	      dd ?
    .glob_cntrl       dd ?
    .glob_sta	      dd ?
    .codec_io_base    dd ?
    .ctrl_io_base     dd ?
    .codec_mem_base   dd ?
    .ctrl_mem_base    dd ?
    .codec_id	      dd ?
}
Сейчас этот вызов остался только в Emu10k1x.asm, в приложениях он не используется.

Я думаю что лучше всего дополнить структуру необходимыми полями. Драйвер будет определять версию по размеру структуры в вызове DEV_GET_INFO, а приложение по версии SOUND.API.
а всё-таки регулировка отдельно правого и левого канала мне показалась интересной, может сделать под это дело дополнительный вызов драйвера? Кстати для AC97 кодеков в принципе можно отдельно регулировать каналы или нет?
Да, такая регулировка есть.
Я не знаю есть ли сейчас программы напрямую устанавливающие громкость кодека. Раньше это был плеер, но теперь в Infinity уровни устанавливаются отдельно для каждого звукового буфера. ИМХО лучший вариант добавить новые вызовы, сохранив совместимость с уже существующими. В этом случае в драйвере надо прописать

Code: Select all

CURRENT_API     equ   0x0200      ;2.00
COMPATIBLE_API  equ   0x0100      ;1.00
API_VERSION     equ   (COMPATIBLE_API shl 16) or CURRENT_API

Re: System audio mixer

Posted: Thu Aug 19, 2010 8:01 am
by Asper
Нашёл у себя на компьютере документацию на 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.
В общем для чего сохранять совместимость не понимаю.

Re: System audio mixer

Posted: Thu Aug 19, 2010 8:14 am
by Asper
Насчёт DEV_GET_INFO я его использовал некоторое время для отладки, а так в приложениях да пока не был задействован. Я просто думал использовать его в HDA драйвере для возвращения данных из переменной spec типа HDA_GSPEC, это позволило бы например программе определять к каким портам какие устройства подключены и другую полезную информацию о имеющихся нодах. Но т.к. в AC97 такой информации нет, то делать отдельный вызов что ли?

Re: System audio mixer

Posted: Thu Aug 19, 2010 11:08 am
by Serge
Asper

Большевики сами создают себе трудности, которые успешно преодолевают.
Править придётся не только программы но и все драйверы. Зачем на ровном месте создавать несовместимость с уже существующим API, когда достаточно двух новых ioctl SET_CHANNEL_VOLUME и GET_CHANNEL_VOLUME ?

Re: System audio mixer

Posted: Thu Aug 19, 2010 8:00 pm
by Asper
:)
Ок. Номера новых вызовов и формат?

Re: System audio mixer

Posted: Sun Aug 22, 2010 8:32 am
by Serge
SET_CHANNEL_VOLUME equ 9
GET_CHANNEL_VOLUME equ 10

формат: номер канала, уровень в -db.

Дополнительно можно сделать пакетный вызов для обработки всех каналов сразу. Передавать битовую карту каналов и за ней массив уровней. Данные лучше не паковать и передавать как dword. Экономия памяти минимальна, больше возни.

Re: System audio mixer

Posted: Sun Aug 22, 2010 8:15 pm
by Asper
Спасибо, примерно так я это себе и представлял.

Re: System audio mixer

Posted: Sat Apr 21, 2012 6:35 pm
by Mario
Почти два года прошло, а общесистемного микшера так и нет.