Board.KolibriOS.org
http://board.kolibrios.org/

System audio mixer
http://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 возможно регулировать только оба канала одновременно, т.е. уровень звучания в обоих каналах будет одинаковый.

Attachments:
File comment: System audio mixer
MIXER.7z [11.36 KiB]
Downloaded 320 times

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
{   .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.
Quote:
а всё-таки регулировка отдельно правого и левого канала мне показалась интересной, может сделать под это дело дополнительный вызов драйвера? Кстати для AC97 кодеков в принципе можно отдельно регулировать каналы или нет?
Да, такая регулировка есть.
Я не знаю есть ли сейчас программы напрямую устанавливающие громкость кодека. Раньше это был плеер, но теперь в Infinity уровни устанавливаются отдельно для каждого звукового буфера. ИМХО лучший вариант добавить новые вызовы, сохранив совместимость с уже существующими. В этом случае в драйвере надо прописать
Code:
CURRENT_API     equ   0x0200      ;2.00
COMPATIBLE_API  equ   0x0100      ;1.00
API_VERSION     equ   (COMPATIBLE_API shl 16) or CURRENT_API

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/