Board.KolibriOS.org

Official KolibriOS board
It is currently Fri Nov 15, 2019 2:36 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 32 posts ]  Go to page 1 2 3 Next
Author Message
 Post subject: System audio mixer
PostPosted: Tue Aug 17, 2010 11:28 pm 
Offline
User avatar

Joined: Fri Jun 27, 2008 3:22 pm
Posts: 988
Простой системный аудиомикшер. Вообще-то писался под драйвер HDA, но сделал также поддержку AC97 драйверов. Из AC97 тестировался только на EMU10K1X, так, что если найдёте ошибку сообщайте.
Внимание корректно работает только с самыми последними версиями драйвера HDA, не старше 15 августа этого года!

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


Attachments:
File comment: System audio mixer
MIXER.7z [11.36 KiB]
Downloaded 351 times
Top
   
 Post subject: Re: System audio mixer
PostPosted: Wed Aug 18, 2010 9:32 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Asper

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


Top
   
 Post subject: Re: System audio mixer
PostPosted: Wed Aug 18, 2010 1:03 pm 
Offline
User avatar

Joined: Fri Jun 27, 2008 3:22 pm
Posts: 988
Serge wrote:
Asper

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


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


Top
   
 Post subject: Re: System audio mixer
PostPosted: Wed Aug 18, 2010 2:32 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Asper
Quote:
вроде бы сейчас для AC97 драйверов уровень громкости задается именно в децибеллах
И для SB16.

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

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

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


Top
   
 Post subject: Re: System audio mixer
PostPosted: Wed Aug 18, 2010 2:42 pm 
Offline
User avatar

Joined: Fri Jun 27, 2008 3:22 pm
Posts: 988
А как ты представляешь установку 10000 значений?

Quote:
А точное значение получать парой SetMasterVol/GetMasterVol.

Так и делается.

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

А можно подробнее?


Top
   
 Post subject: Re: System audio mixer
PostPosted: Wed Aug 18, 2010 4:13 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
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) выглядит слишком большим.


Top
   
 Post subject: Re: System audio mixer
PostPosted: Wed Aug 18, 2010 7:21 pm 
Offline
User avatar

Joined: Fri Jun 27, 2008 3:22 pm
Posts: 988
Всё теперь понял.
Хм... а всё-таки регулировка отдельно правого и левого канала мне показалась интересной, может сделать под это дело дополнительный вызов драйвера? Кстати для AC97 кодеков в принципе можно отдельно регулировать каналы или нет?
DEV_GET_INFO тоже стандартизован?


Top
   
 Post subject: Re: System audio mixer
PostPosted: Wed Aug 18, 2010 8:46 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
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


Top
   
 Post subject: Re: System audio mixer
PostPosted: Thu Aug 19, 2010 8:01 am 
Offline
User avatar

Joined: Fri Jun 27, 2008 3:22 pm
Posts: 988
Нашёл у себя на компьютере документацию на 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.
В общем для чего сохранять совместимость не понимаю.


Top
   
 Post subject: Re: System audio mixer
PostPosted: Thu Aug 19, 2010 8:14 am 
Offline
User avatar

Joined: Fri Jun 27, 2008 3:22 pm
Posts: 988
Насчёт DEV_GET_INFO я его использовал некоторое время для отладки, а так в приложениях да пока не был задействован. Я просто думал использовать его в HDA драйвере для возвращения данных из переменной spec типа HDA_GSPEC, это позволило бы например программе определять к каким портам какие устройства подключены и другую полезную информацию о имеющихся нодах. Но т.к. в AC97 такой информации нет, то делать отдельный вызов что ли?


Top
   
 Post subject: Re: System audio mixer
PostPosted: Thu Aug 19, 2010 11:08 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Asper

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


Top
   
 Post subject: Re: System audio mixer
PostPosted: Thu Aug 19, 2010 8:00 pm 
Offline
User avatar

Joined: Fri Jun 27, 2008 3:22 pm
Posts: 988
:)
Ок. Номера новых вызовов и формат?


Top
   
 Post subject: Re: System audio mixer
PostPosted: Sun Aug 22, 2010 8:32 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
SET_CHANNEL_VOLUME equ 9
GET_CHANNEL_VOLUME equ 10

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

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


Top
   
 Post subject: Re: System audio mixer
PostPosted: Sun Aug 22, 2010 8:15 pm 
Offline
User avatar

Joined: Fri Jun 27, 2008 3:22 pm
Posts: 988
Спасибо, примерно так я это себе и представлял.


Top
   
 Post subject: Re: System audio mixer
PostPosted: Sat Apr 21, 2012 6:35 pm 
Почти два года прошло, а общесистемного микшера так и нет.


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 32 posts ]  Go to page 1 2 3 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 5 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited