System audio mixer

Processing, playback of audio and video
  • Asper

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

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

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

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

    2.Формат вызовов DEV_GET_MASTERVOL и DEV_SET_MASTERVOL в новом драйвере изменён, что приводит к несовместимости.
  • А как ты представляешь установку 10000 значений?
    А точное значение получать парой SetMasterVol/GetMasterVol.
    Так и делается.
    2.Формат вызовов DEV_GET_MASTERVOL и DEV_SET_MASTERVOL в новом драйвере изменён, что приводит к несовместимости.
    А можно подробнее?
  • 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) выглядит слишком большим.
  • Всё теперь понял.
    Хм... а всё-таки регулировка отдельно правого и левого канала мне показалась интересной, может сделать под это дело дополнительный вызов драйвера? Кстати для AC97 кодеков в принципе можно отдельно регулировать каналы или нет?
    DEV_GET_INFO тоже стандартизован?
  • 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
  • Нашёл у себя на компьютере документацию на 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.
    В общем для чего сохранять совместимость не понимаю.
  • Насчёт DEV_GET_INFO я его использовал некоторое время для отладки, а так в приложениях да пока не был задействован. Я просто думал использовать его в HDA драйвере для возвращения данных из переменной spec типа HDA_GSPEC, это позволило бы например программе определять к каким портам какие устройства подключены и другую полезную информацию о имеющихся нодах. Но т.к. в AC97 такой информации нет, то делать отдельный вызов что ли?
  • Asper

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

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

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

    Users browsing this forum: No registered users and 5 guests