Help - Search - Members - Calendar
Full Version: Voodoohda
Project OS X Forums > Languages > Русский > Драйвера > Звук
Pages: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
AutumnRain
Добрый день.

Предлагаю вашему вниманию мою версию драйвера VoodooHDA
От оригинальной версией от команды Voodoo эта версия отличается несколькими моментами:
был изменен набор настроек в PrefPanel, что позволило в моем случае завести микрофон
добавлена возможность вносить изменения в настройки нод через редактирования Info.plist драйвера.

Рассмотрим способ внесения изменений в настройки нод.
Для того чтобы изменить настройки ноды добавте в секцию NodesToPath в файле Info.plist дочерние ключи так как это показано в примере:

CODE
<key>NodesToPatch</key>
<array>
<dict>
<key>Codec</key>
<integer>0</integer>
<key>Node</key>
<integer>20</integer>
<key>Config</key>
<string>0x99130110</string>
<key>Type</key>
<integer>4</integer>
</dict>
<dict>
<key>Codec</key>
<integer>0</integer>
<key>Node</key>
<integer>8</integer>
<key>select</key>
<integer>1</integer>
<key>Type</key>
<integer>1</integer>
</dict>
</array>


В примере меняются настройки двух нод 20 и 8 кодека номер 0.
Для Ноды 20 с помощью ключа Config задается новый PinConfig.
С помощью ключа Conns указывается номер ноды к которой будет подключатся нода 20. Получается цепочка 20 -> 12
С помощью ключа Type задается тип коннектора.
возможные значения:
0 - [Audio Output]
1 - [Audio Input]
4 - [Pin Complex]


В версии 2.5.3 появилась возможность указывать в Info.plist настройки регуляторов из PrefPanel по умолчанию. Для этого в Info.plist появилась новая секция - MixerValues

CODE
<key>IOUserClientClass</key>
            <string>VoodooHDAUserClient</string>
            <key>MixerValues</key>
            <dict>
                <key>iMix</key>
                <string>90</string>
            </dict>
            <key>NodesToPatch</key>
            <array/>
            <key>VoodooHDAVerboseLevel</key>
            <integer>1</integer>



В это секции нужно перечислить те регуляторы значения которых вы хотите задать. В примере задано значение для регулятора iMix. Значение можно задавать от 0 до 99.

Вот перечень имен регуляторов:
CODE
Main
Bass
Trable
Synth
PCM
Speaker
Line
Mic
CD
iMix
AltPCM
Rec
iGain
oGain
Line1
Line2
Line3
Dig1
Dig2
Dig3
PhoneIn
PhoneOut
Video
Radio
Monitor


Имена некоторых регуляторов для Info.plist были сокращены для удобства их записи, но их соответствие регуляторам из PrefPanel вполне очевидно.

VoodooHDA является заменой стандартному AppleHDA. Поэтому во избежание kernel panic бекапте и удаляете AppleHDA.kext прежде чем ставить VoodooHDA!


Господа, драйвер находиться на этапе разработки. Возможно и даже наверняка у кого-нибудь он не заработает. Чтобы помочь нам исправить ошибки в драйвере в ваших сообщениях приводите следующую информацию:
  1. напишете драйвером какой версии вы воспользовались
  2. называйте вашу звуковую карточку
  3. описывайте какие входы/выходы существуют на вашем компьютере. Например: Разъем для наушников джек черного цвета, и т.д.
  4. перечислите какие из них работают и какие нет
  5. прикрепите к вашем сообщению результат работы утилиты getDump


Утилита getDump - позволяет получить все настройки драйвера VoodooHDA + схемы соединения нодов.
Click to view attachment

Утилита getExtDump - позволяет получить из загруженного драйвера VoodooHDA текущие настройки усиления для всех нод
Click to view attachment

Наиболее полную информацию о системе дадут оба дампа.

PrefPanel - позволяет настраивать усиление звука для каждого входа и выхода
Click to view attachment



UPDATE 22.08.2009
- убрано сообщение VoodooHDAEngine[0x4e41500]::volumeChanged из лога
+ добавлен параметр Codec в настройках нода в Info.plist для задание адреса кодека

UPDATE 28.08.2009
*исправлена работа с внутренним микрофоном.
*исправлен алгоритм вычисления рабочих цепочек.

UPDATE 06.10.2009
+Сделана автосмена названия устройства в настройках звука
*некоторые исправления связанные с работой автодетекта

UPDATE 20.12.2009
+Сделано чтение настроек регуляторов из Info.plist

UPDATE 7.02.2010
+Теперь регулятор imix не будет влиять на выходные миксеры
+добавлен параметр select в настройках ноды в Info.plist для задания выбранного выхода ноды.

Click to view attachment
Click to view attachment
Click to view attachment

UPDATE 15.02.2010 (Экспериментальная версия)
+Добавлен параметр DAC

UPDATE 26.02.2010 (Экспериментальная версия)
+Добавлен параметр SwitchCh

Click to view attachment
Click to view attachment
Click to view attachment

Версия 2.6.2
Click to view attachment
Click to view attachment
Slice
Наверно, нужно дать еще ссылку на PrefPanel, или вообще ее здесь прикрепить. Наконец-то она у меня заработала!

Поздравляю! Эта версия - великий шаг вперед. Первое испытание: чистый инфо-плист.
Систем-лог:
QUOTE
Aug 22 11:36:20 localhost kernel[0]: Natit: Starting.
Aug 22 11:36:20 localhost kernel[0]: Natit: Found device with ID=0x284B
Aug 22 11:36:20 localhost kernel[0]: VoodooHDADevice[0x2422e000]::init
Aug 22 11:36:20 localhost kernel[0]: VoodooHDADevice::mixerSetDefaults
Aug 22 11:36:20: --- last message repeated 3 times ---
Aug 22 11:36:20 localhost kernel[0]: dacNid = 2, outputNid = 3, devType = Digital-out, connType = Jack
Aug 22 11:36:20 localhost kernel[0]: warning: found invalid min/max dB (using default -22.5 -> 0.0 range)
Aug 22 11:36:20 localhost kernel[0]: dacNid = 2, outputNid = 13, devType = Speaker, connType = Fixed
Aug 22 11:36:20 localhost kernel[0]: dacNid = 7, outputNid = 14, devType = Mic, connType = Jack
Aug 22 11:36:20 localhost kernel[0]: dacNid = 5, outputNid = 15, devType = Line-out, connType = Jack
Aug 22 11:36:20 localhost kernel[0]: dacNid = 30, outputNid = 33, devType = Digital-out, connType = Fixed
Aug 22 11:36:20 localhost kernel[0]: warning: found invalid min/max dB (using default -22.5 -> 0.0 range)
...
Aug 22 11:36:57 HackBook-2 kernel[0]: VoodooHDAEngine[0x4e41500]::volumeChanged(0x4e41000, 73, 70)
Aug 22 11:36:57 HackBook-2 kernel[0]: VoodooHDAEngine[0x4e41500]::volumeChanged(0x4e41100, 73, 70)
Aug 22 11:36:57 HackBook-2 kernel[0]: VoodooHDAEngine[0x4e41500]::volumeChanged(0x4e41000, 70, 69)
Aug 22 11:36:57 HackBook-2 kernel[0]: VoodooHDAEngine[0x4e41500]::volumeChanged(0x4e41100, 70, 69)
Aug 22 11:36:57 HackBook-2 kernel[0]: VoodooHDAEngine[0x4e41500]::volumeChanged(0x4e41000, 69, 66)
Aug 22 11:36:57 HackBook-2 kernel[0]: VoodooHDAEngine[0x4e41500]::volumeChanged(0x4e41100, 69, 66)

Последнее сообщение повторяется пяцоттыщ раз. Надо убирать!
minMaxDB чего-то орет про цифровые выходы, а вот про микрофон орать перестала, и внешний микрофон заработал.
Спикер работает, при включении наушников в левое гнездо звук переключается туда. Правое гнездо работает как Line-out.
Т.е. работает все, кроме встроенного микрофона. Картинки:
Click to view attachment Click to view attachment Click to view attachment
Приступаю к подбору патчей.
getExtDump также отработала нормально, и дала информацию по всем трем адресам.

Кстати, а когда мы пишем патч для ноды 3, какой адрес имеется ввиду? Что-то здесь надо пересмотреть.
Slice
Продолжаю тестирование.
Теперь десктоп с ALC883. Физически имеются 6 разъемов сзади, 2 спереди, и SPDIF. Про последний ничего не знаю.
VoodooHDA с чистым инфо-плистом дает звук на два зеленых разъема - передний и задний. Эти разъемы основные, они и для AppleHDA выделенные, остальные выходные устройства не присутствуют (кроме SPDIF).
В панели есть два микрофона, т.е. передний и задний розовые разъемы. Никакие настройки звука в префПанели не помогают, в сквозном канале только шипение (сквозной канал организовал через QuickTimePro Player, вариант работает на ноуте). Громкость шипения можно регулировать в панели.
Это означает, что входная нода микрофона имеет низкую чувствительность, а регулировка происходит на уровне следующих усилителей, ну они и усиливают собственный шум.
Патчем на том компьютере заниматься нет возможности, возвращаюсь к ноутбуку.

Прописав патч на 12 ноду, которая у меня прекрасно работала с AppleHDA, я получил в контрольной панели второй микрофон. Увы, второе устройство тоже, почему-то, реагирует только на внешний микрофон, но никак не на внутренний. Пока изучаю варианты.
Мне не нравится отображение микрофона в системе - "Mic", Можно сделать подробнее "Mic Int", "Mic Ext", "Line Out"
AutumnRain
QUOTE (Slice @ Aug 22 2009, 11:56 AM) *
Наверно, нужно дать еще ссылку на PrefPanel, или вообще ее здесь прикрепить. Наконец-то она у меня заработала!


Добавил

QUOTE (Slice @ Aug 22 2009, 11:56 AM) *
Систем-лог:
Последнее сообщение повторяется пяцоттыщ раз. Надо убирать!


QUOTE (Slice @ Aug 22 2009, 11:56 AM) *
Кстати, а когда мы пишем патч для ноды 3, какой адрес имеется ввиду? Что-то здесь надо пересмотреть.


Выложил версию 0.2.34 в которой исправил эти недочеты.

Наконец-то работает еще у какого-то кроме меня!!! Ура!!

QUOTE (Slice @ Aug 22 2009, 05:57 PM) *
Продолжаю тестирование.
Теперь десктоп с ALC883. Физически имеются 6 разъемов сзади, 2 спереди, и SPDIF. Про последний ничего не знаю.
VoodooHDA с чистым инфо-плистом дает звук на два зеленых разъема - передний и задний. Эти разъемы основные, они и для AppleHDA выделенные, остальные выходные устройства не присутствуют (кроме SPDIF).
В панели есть два микрофона, т.е. передний и задний розовые разъемы. Никакие настройки звука в префПанели не помогают, в сквозном канале только шипение (сквозной канал организовал через QuickTimePro Player, вариант работает на ноуте). Громкость шипения можно регулировать в панели.
Это означает, что входная нода микрофона имеет низкую чувствительность, а регулировка происходит на уровне следующих усилителей, ну они и усиливают собственный шум.
Патчем на том компьютере заниматься нет возможности, возвращаюсь к ноутбуку.


Интересно было бы взглянуть на дампы этого десктопа.

QUOTE (Slice @ Aug 22 2009, 05:57 PM) *
Прописав патч на 12 ноду, которая у меня прекрасно работала с AppleHDA, я получил в контрольной панели второй микрофон. Увы, второе устройство тоже, почему-то, реагирует только на внешний микрофон, но никак не на внутренний. Пока изучаю варианты.


Буду ждать новостей. smile.gif

QUOTE (Slice @ Aug 22 2009, 05:57 PM) *
Мне не нравится отображение микрофона в системе - "Mic", Можно сделать подробнее "Mic Int", "Mic Ext", "Line Out"


А как названы устройства в PrefPanel устраивает?
Slice
Проанализировал дампы с двух компов по поводу "микрофонов".
Рабочая ситуация STAC9228, внешний микрофон
7 - input
27 - oss:mic mute
24 - oss:rec 0:21dB
21 - oss:mic 0:40dB
14 - src:mic PinComplex 02a11020 Cap=1737
Итак, здесь src=oss=mic - все работает
CODE
    else if (direction == kIOAudioStreamDirectionInput) {
        usage = kIOAudioControlUsageInput;
        initOssDev = SOUND_MIXER_MIC;

Нерабочая цепочка STAC9228, внутренний микрофон (она работает в AppleHDA)
8 - input
28 - oss:monitor mute
25 - oss:rec 0:21dB
22 -oss:monitor 0:40dB
12 - src:monitor PinComplex 0x90a39140 Cap=1737
Итак, разница только в том, что это не mic, а monitor, т.е. встроенный микрофон, для которого программа не предусмотрела никакого решения.

Теперь ALC883 оба внешние входа не работают
9 - input
34 - oss;monitor, rec, speaker, mix
25 - src:monitor PinComplex 02a19c50 Cap=173e
Причина - монитор
8 - input
35 - oss:rec -12:+34dB
24 - src:mic PinComplex 0x01a19c40 Cap=173e
и, одновременно,
26 - src:line PinComplex 0x0181344f Cap= 173e
CODE
Record:

    nid=8 [audio input]
      |
      + <- nid=35 [audio mixer] [src: speaker, line, mic, mix]
             |
             + <- nid=24 [pin: Mic (Pink Jack)] [src: mic]
             + <- nid=26 [pin: Line-in (Blue Jack)] [src: line]
             + <- nid=29 [beep widget] [src: speaker]
             + <- nid=11 [audio mixer] [src: mix]

Здесь, видать, мешает присутствие line, которую можно отменить параметром conns.

Но в целом, исходники нужно расширять на другие типы входов и выходов. Почему только mic?
Slice
QUOTE (AutumnRain @ Aug 22 2009, 04:38 PM) *
Интересно было бы взглянуть на дампы этого десктопа.

Click to view attachment
QUOTE
А как названы устройства в PrefPanel устраивает?

Да, здесь получше.
Click to view attachment
Slice
QUOTE (Slice @ Aug 22 2009, 05:05 PM) *
Проанализировал дампы с двух компов по поводу "микрофонов".
Рабочая ситуация STAC9228, внешний микрофон
7 - input
27 - oss:mic mute
24 - oss:rec 0:21dB
21 - oss:mic 0:40dB
14 - src:mic PinComplex 02a11020 Cap=1737
Итак, здесь src=oss=mic - все работает
CODE
    else if (direction == kIOAudioStreamDirectionInput) {
        usage = kIOAudioControlUsageInput;
        initOssDev = SOUND_MIXER_MIC;

Нерабочая цепочка STAC9228, внутренний микрофон (она работает в AppleHDA)
8 - input
28 - oss:monitor mute
25 - oss:rec 0:21dB
22 -oss:monitor 0:40dB
12 - src:monitor PinComplex 0x90a39140 Cap=1737
Итак, разница только в том, что это не mic, а monitor, т.е. встроенный микрофон, для которого программа не предусмотрела никакого решения.

А вот, кстати, и систем-лог этой ситуации
QUOTE
Aug 23 09:18:00 localhost kernel[0]: Natit: Found device with ID=0x284B
Aug 23 09:18:00 localhost kernel[0]: VoodooHDADevice[0x2363a000]::init
Aug 23 09:18:00 localhost kernel[0]: VoodooHDADevice::mixerSetDefaults
Aug 23 09:18:00: --- last message repeated 3 times ---
Aug 23 09:18:00 localhost kernel[0]: dacNid = 2, outputNid = 3, devType = Digital-out, connType = Jack
Aug 23 09:18:00 localhost kernel[0]: warning: found invalid min/max dB (using default -22.5 -> 0.0 range)
Aug 23 09:18:00 localhost kernel[0]: dacNid = 2, outputNid = 13, devType = Speaker, connType = Fixed
Aug 23 09:18:00 localhost kernel[0]: dacNid = 7, outputNid = 14, devType = Mic, connType = Jack
Aug 23 09:18:00 localhost kernel[0]: dacNid = 5, outputNid = 15, devType = Line-out, connType = Jack
Aug 23 09:18:00 localhost kernel[0]: dacNid = 8, outputNid = 12, devType = Mic, connType = Fixed
Aug 23 09:18:00 localhost kernel[0]: warning: found invalid min/max dB (using default -22.5 -> 0.0 range)

Aug 23 09:18:00 localhost kernel[0]: dacNid = 30, outputNid = 33, devType = Digital-out, connType = Fixed
Aug 23 09:18:00 localhost kernel[0]: warning: found invalid min/max dB (using default -22.5 -> 0.0 range)


P.S. Кстати, под словом Codec народ понимает CodecID, я предлагаю поменять на Addr в списке патчей, чтобы не путались. Да и пора составлять инструкции, что можно пропатчить, если в дампе видим какие-то несоответствия.
Вот в моей ситуации с помощью патча я добавил ноду 12, соответствующую внутреннему микрофону. С тебя объяснения по поводу твоих добавок. Да и общие соображения, если есть.
Yurik
а это версия для лео или для ирбиса?
Slice
QUOTE (Yurik @ Aug 23 2009, 10:53 AM) *
а это версия для лео или для ирбиса?

Пока мы ее компилировали под 32 бита, но в исходниках нет ничего особо системно зависимого. Будет окончательный вариант - кто-нибудь компильнет под х64.

2 AutumnRain
Я чего-то не понял насчет количества коннекторов
CODE
NodesToPatchArray[i].nConns = nArrayCount;

В чем здесь идея?
AutumnRain
QUOTE (Slice @ Aug 23 2009, 06:30 PM) *
2 AutumnRain
Я чего-то не понял насчет количества коннекторов
CODE
NodesToPatchArray[i].nConns = nArrayCount;

В чем здесь идея?


Точнее будет так:
CODE
if (tmpString->isEqualTo("Conns")){
                        for(unsigned int arrayIndex = 0; arrayIndex < nArrayCount; arrayIndex++) {
                            NodesToPatchArray[i].Conns[arrayIndex] = tmpUIArray[arrayIndex];
                        }
                        NodesToPatchArray[i].nConns = nArrayCount;



Я сделал так, чтобы можно было указать больше одного конектора в Info.plist.
Пример:
CODE
<key>NodesToPatch</key>
            <array>
                <dict>
                    <key>Codec</key>
                    <integer>0</integer>
                    <key>Node</key>
                    <integer>8</integer>
                    <key>Conns</key>
                    <array>
                            <integer>12</integer>
                            <integer>13</integer>
                            <integer>14</integer>
                    </array>
                    <key>Type</key>
                    <integer>1</integer>
                </dict>
            </array>


Теперь у ноды 8 будет соединение с нодой 12, 13 и 14

Slice
QUOTE (AutumnRain @ Aug 23 2009, 06:28 PM) *
Я сделал так, чтобы можно было указать больше одного конектора в Info.plist.

Твою идею я знаю, но мне что-то сомнительно, что переменная nArrayCount будет относится к этому массиву, а не к списку нод.
И еще я подумал, что неплохо было бы вынести CodecAddress за скобки.
CODE
<key>NodesToPatch</key>
            <array>
                <key>Codec</key>
                <integer>0</integer>
                    <array>
                    <dict>
                    <key>Node</key>
                    <integer>8</integer>
                   </dict>
                    <dict>
                    <key>Node</key>
                    <integer>9</integer>
                   </dict>
                   </array>
                </array>
Как думешь, реально? Или клиентам так будешь сложнее?

Теперь мои попытки завести внутренний микрофон на Сигмателе.
В исходники внес min/max dB такой же, как и для внешнего микрофона. Это не совсем правда, но неважно: причина не в этом.
Систем-лог
QUOTE
Aug 24 16:02:51 HackBook-2 kernel[0]: VoodooHDADevice[0x241fe000]::init
Aug 24 16:02:51 HackBook-2 kernel[0]: VoodooHDADevice::mixerSetDefaults
Aug 24 16:02:51: --- last message repeated 3 times ---
Aug 24 16:02:51 HackBook-2 kernel[0]: dacNid = 2, outputNid = 3, devType = Digital-out, connType = Jack
Aug 24 16:02:51 HackBook-2 kernel[0]: warning: found invalid min/max dB (using default 0-40dB range)
Aug 24 16:02:51 HackBook-2 kernel[0]: dacNid = 2, outputNid = 13, devType = Speaker, connType = Fixed
Aug 24 16:02:51 HackBook-2 kernel[0]: dacNid = 7, outputNid = 14, devType = Mic, connType = Jack
Aug 24 16:02:51 HackBook-2 kernel[0]: dacNid = 5, outputNid = 15, devType = Line-out, connType = Jack
Aug 24 16:02:51 HackBook-2 kernel[0]: dacNid = 8, outputNid = 12, devType = Mic, connType = Fixed
Aug 24 16:02:51 HackBook-2 kernel[0]: warning: found invalid min/max dB (using default 0-40dB range)
Aug 24 16:02:51 HackBook-2 kernel[0]: dacNid = 30, outputNid = 33, devType = Digital-out, connType = Fixed
Aug 24 16:02:51 HackBook-2 kernel[0]: warning: found invalid min/max dB (using default 0-40dB range)

Варнинг уже известный, диапазон я подправил.
В дампах рабочая и нерабочая цепочки имеют совершенно одинаковые характеристики
CODE
Record: Рабочая цепочка

nid=7 [audio input]
|
+ <- nid=27 [audio selector] [src: mic]
|
+ <- nid=24 [audio selector] [src: mic]
|
+ <- nid=21 [audio selector] [src: mic]
|
+ <- nid=14 [pin: Mic (Black Jack)] [src: mic]
Microphone Volume (OSS: mic)
|
+- control 6 (nid 21 out): +0/+40dB (5 steps) -- чувствительность микрофона, только через VoodooPrefPane
+- control 12 (nid 27 out): mute
Recording Level (OSS: rec)
|
+- control 9 (nid 24 in 0): +0/+21dB (15 steps) -- этот регулятор отображается в панели Sound
+- control 12 (nid 27 out): mute

nid: 7
Name: audio input
Widget cap: 0x001d0541
PWR PROC STEREO
Association: 1 (0x00000001)
Stream cap: 0x00000001
PCM
PCM cap: 0x000e07e0
16 20 24 bits, 44 48 88 96 176 192 KHz
connections: 1
|
+ <- nid=27 [audio selector]

Record: Нерабочая цепочка

nid=8 [audio input]
|
+ <- nid=28 [audio selector] [src: monitor]
|
+ <- nid=25 [audio selector] [src: monitor]
|
+ <- nid=22 [audio selector] [src: monitor]
|
+ <- nid=12 [pin: Mic (Fixed)] [src: monitor]
Microphone2 Volume (OSS: monitor)
|
+- control 7 (nid 22 out): +0/+40dB (5 steps) -- регулятор чувствительности недоступен нигде
+- control 13 (nid 28 out): mute

Recording Level (OSS: rec)
|
+- control 10 (nid 25 in 0): +0/+21dB (15 steps) -- этот регулятор отображается в панели Sound

+- control 13 (nid 28 out): mute

nid: 8
Name: audio input
Widget cap: 0x001d0541
PWR PROC STEREO
Association: 3 (0x00000001)
Stream cap: 0x00000001
PCM
PCM cap: 0x000e07e0
16 20 24 bits, 44 48 88 96 176 192 KHz
connections: 1
|
+ <- nid=28 [audio selector]

Вот картинки Click to view attachment Click to view attachment Click to view attachment
Можешь пояснить мне, где что изменить, чтобы prefPane увидела регулятор ноды 22?
Slice
Подправил исходники для получения вот такого результата
CODE
Record:

    nid=8 [audio input]
      |
      + <- nid=28 [audio selector] [src: mic, monitor]
             |
             + <- nid=25 [audio selector] [src: mic, monitor]
                    |
                    + <- nid=22 [audio selector] [src: mic, monitor]
                           |
                           + <- nid=12 [pin: Microphone (Fixed)] [src: mic, monitor]

Регулятор не появился, микрофон не заработал.
AutumnRain
2 Slice

Я не каждый день имею возможность работать над драйвером. Но стараюсь по быстрее разобраться тем, чтобы все нужные регуляторы OSS устройств попали на панель PrefPanel.
На счет warning: found invalid min/max dB (using default 0-40dB range) я не уверен, что из-за этого не работает микрофон.
Скорее всего из того что отключен усилитель на одной из промежуточных нод между микрофоном и цифровым входом. К сожалению дамп утилиты getExtDump который ты прилагал к своему посту - пустой. Скажи она (утилита getExtDump) у тебя работает? Можешь ли ты
выставить все регуляторы на вкладке соответствующей не работающему микрофону на максимумы и снять дамп утилитой getExtDump.
Slice
Есть исходники prefPanel
Click to view attachment
Небольшое отличие - теперь можно включить все регуляторы общим тумблером.
Click to view attachment
Микрофон не заработал! Я просто путаюсь в исходниках, не могу отследить, где присваюваются регуляторы нодам, и как на это влияет ПрефПанель.
ExtDump
CODE
nid: 8
Name: audio input
Widget cap: 0x001d0541
PWR PROC STEREO
Association: 3 (0x00000001)
connections: 1
|
+ <- nid=28 [audio selector]

nid: 28
Name: audio selector
Widget cap: 0x0030090d
LRSWAP STEREO
Association: 3 (0x00000001)
OSS: mic, monitor
Output amp: 0x80000000
mute=1 step=0 size=0 offset=0
Output val: [0x00 0x00]
connections: 3
|
+ <- nid=25 [audio selector] (selected)
+ [DISABLED] <- nid=19 [pin: Other (None)] [DISABLED]
+ [DISABLED] <- nid=20 [pin: Other (None)] [DISABLED]

nid: 25
Name: audio selector
Widget cap: 0x00300103
STEREO
Association: 3 (0x00000001)
OSS: mic, monitor
Input amp: 0x00050e00
mute=0 step=14 size=5 offset=0
Input val: [0x0C 0x0C]
connections: 1
|
+ <- nid=22 [audio selector]

nid: 22
Name: audio selector
Widget cap: 0x0030010d
STEREO
Association: 3 (0x00000001)
OSS: mic, monitor
Output amp: 0x00270400
mute=0 step=4 size=39 offset=0
Output val: [0x02 0x02]
connections: 1
|
+ <- nid=12 [pin: Microphone (Fixed)]

nid: 12
Name: pin: Microphone (Fixed)
Widget cap: 0x00400181
UNSOL STEREO
Association: 3 (0x00000001)
OSS: mic, monitor (monitor)
Pin cap: 0x00001737
ISC TRQD PDC OUT IN VREF[ 50 80 GROUND HIZ ]
Pin config: 0x90a39150
Pin control: 0x00000024 IN VREFs
connections: 1
|
+ [DISABLED] <- nid=3 [audio output] [DISABLED]

Microphone2 Volume (OSS: monitor)
|
+- control 7 (nid 22 out): +0/+40dB (5 steps)
+- control 13 (nid 28 out): mute

Recording Level (OSS: rec)
|
+- control 10 (nid 25 in 0): +0/+21dB (15 steps)
+- control 13 (nid 28 out): mute


Здесь OSS: mic, monitor - уже уже мои попытки сделать маску, чтобы воспринимала как микрофон. Но видать не туда прописал.

ЗЫ: У ноды 22 нет входного усилителя???
AutumnRain
QUOTE (Slice @ Aug 25 2009, 12:30 PM) *
Есть исходники prefPanel
Небольшое отличие - теперь можно включить все регуляторы общим тумблером.


Толку от этого общего тумблера нет - т.к. регулятор должен быть связан с внутренней таблицей где храниться номер кодека, номер PCM устройства для однозначной связи с OSS устройством.

QUOTE (Slice @ Aug 25 2009, 12:30 PM) *
Микрофон не заработал! Я просто путаюсь в исходниках, не могу отследить, где присваюваются регуляторы нодам, и как на это влияет ПрефПанель.


Как будет возможность, я опишу алгоритм работы с PrefPanel. Пока прости, ноутбук дома, я на работе. sad.gif

QUOTE (Slice @ Aug 25 2009, 12:30 PM) *
ЗЫ: У ноды 22 нет входного усилителя???


А почему ты это считаешь странным? У ноды 25 тоже нет выходного усилителя, а ноды 8 вообще никого нет.
Slice
QUOTE (AutumnRain @ Aug 25 2009, 08:48 AM) *
А почему ты это считаешь странным? У ноды 25 тоже нет выходного усилителя, а ноды 8 вообще никого нет.

Да, у 21-й ноды тоже нету, а она участвует в рабочей цепочке для внешнего микрофона.
Короче, сверил по всем дампам рабочую цепочку от 7 ноды (внешний микрофон) и от 8 ноды - внутренний. Разницы не увидел.
Физически вторая цепочка работает с AppleHDA.
Буду теперь смотреть, где Вуду работает с микрофон не так, как с монитором.
Slice
Нашел! angry.gif
CODE
            case HDA_CONFIG_DEFAULTCONF_DEVICE_MIC_IN:
                if ((widget->pin.config & HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK)
                        == HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_JACK)  //внешний определим позднее как тип 2
                    break;
                type = 1;     //внутренний микрофон
                break;

Изучаю дальше.

Блин! Даже поменяв mic<->monitor, и выставив в префпанели два регулятора, (которые работают!), я, вместо звука, имею только шипение, громкость которого регулируется обоими регуляторами. Где же ошибка?

P.S. В контрольной панели микрофоны внутренний и внешний не отличаются, надо бы исправить. (тип 1 и 2)
AutumnRain
2 Slice

Чтобы появился регулятор monitor нужно внести следующие изменения:
VoodooHDADevice.cpp строка 2498
CODE
for(int j = 1; j < 24; j++) {
            if(sliderTabs[i].volSliders[j].enabled == 0)
                continue;


Заменить на

CODE
for(int j = 1; j < 25; j++) {
            if(sliderTabs[i].volSliders[j].enabled == 0)
                continue;



VoodooHDADevice.cpp строка 2420
CODE
        mPrefPanelMemoryBuf[i].size = nSliderTabsCount;
        for(int j = 1; j < 24; j++) {
            if(sliderTabs[i].volSliders[j].enabled == 0)
                continue;


Заменить на

CODE
        mPrefPanelMemoryBuf[i].size = nSliderTabsCount;
        for(int j = 1; j < 25; j++) {
            if(sliderTabs[i].volSliders[j].enabled == 0)
                continue;



VoodooHDADevice.h строка 55
CODE
    PcmDevice *pcmDevice; //Указатель на устройство PCM к которому принадлежат OSS Dev регуляторов на данной вкладке
    volSlider volSliders[24]; //Регуляторы на вкладке


Заменить на

CODE
    PcmDevice *pcmDevice; //Указатель на устройство PCM к которому принадлежат OSS Dev регуляторов на данной вкладке
    volSlider volSliders[25]; //Регуляторы на вкладке


Есть какие-нибудь наработки?
Slice
QUOTE (AutumnRain @ Aug 26 2009, 06:10 PM) *
Есть какие-нибудь наработки?

Твои советы завтра же буду внедрять. Я там уже немало поковырялся в исходниках, да еще исверил с оригинальными 2.2. Оказалось, что твой метод доступа к префПанели практически совпадает с вудушным, и у них тоже внедрен патч пинкофига через инфо-плист. Но мы уже работаем над своей версией, а их версия более не развивается.
Конкретных достижений у меня нет, вот еще с названиями устройств экпериментирую, хочу, чтобы в панели "Звук" микрофоны были разные, и уже нашел, как это делается.
Еще странность: я сделал два устройства, но когда я втыкаю внешний микрофон, оба устройства его слышат. Внутренний пока молчит.
Такое впечатление, что обе ноды замыкаются на внешнее гнездо, но не на внутренний микрофон. Как это может быть?
AutumnRain
QUOTE (Slice @ Aug 27 2009, 12:52 AM) *
Твои советы завтра же буду внедрять. Я там уже немало поковырялся в исходниках, да еще исверил с оригинальными 2.2. Оказалось, что твой метод доступа к префПанели практически совпадает с вудушным, и у них тоже внедрен патч пинкофига через инфо-плист. Но мы уже работаем над своей версией, а их версия более не развивается.


Сегодня я взял ноут с собой на работу, так что могу тебе помогать.

QUOTE (Slice @ Aug 27 2009, 12:52 AM) *
Конкретных достижений у меня нет, вот еще с названиями устройств экпериментирую, хочу, чтобы в панели "Звук" микрофоны были разные, и уже нашел, как это делается.


Здорово. Может нам выложить исходники проекта в какой-нибудь публичный SVN сервер. Так будет проще одновременно работать над ним. Ты пользовался системой SVN?

QUOTE (Slice @ Aug 27 2009, 12:52 AM) *
Еще странность: я сделал два устройства, но когда я втыкаю внешний микрофон, оба устройства его слышат. Внутренний пока молчит.
Такое впечатление, что обе ноды замыкаются на внешнее гнездо, но не на внутренний микрофон. Как это может быть?


Возможно те данные о цепочках которые определил VoodooHDA не верны? А может верны, но сигнал все же проходит от внешнего микрофона к одному из цифровых входов.
Взгляни на схему которую я высылал тебе вместе со статьей. У меня два из трех микрофонов (ноды 18h и 19h) подключены к нодам 22h и 23h одновременно. Таким образом существуют две альтернативные цепочки от каждого микрофона к цифровому входу микросхемы. Например 18->22->9 и 18->23->8
Даже если нода 23 будет помечена в VoodooHDA как отключенная она может работать если входной и выходной усилители этой ноды будут иметь значения усиления по умолчанию отличные от 0.
AutumnRain
Искал тут дамп для твоей системы (не нашел, можешь выложить?) и наткнулся на схему Как сделать HDA звук, Патчим вручную (пост 11) если это та самая схема, то на ней видно что оба микрофона выдают сигнал как на ноду 23, так и на ноду 24 и на ноду 25.

Если у тебя есть рабочая цепочка:
CODE
Record: Рабочая цепочка

nid=7 [audio input]
|
+ <- nid=27 [audio selector] [src: mic]
|
+ <- nid=24 [audio selector] [src: mic]
|
+ <- nid=21 [audio selector] [src: mic]
|
+ <- nid=14 [pin: Mic (Black Jack)] [src: mic]


то попробуй переключить селектор ноды 21 на другой вход, тот к которому подключен встроенный микрофон.

P.S. И схему пришли пожалуйста. smile.gif
Slice
Во-первых, свои изначальные дампы я выложил в ветку про AppleHDA - клуббер интересовался.
http://www.projectosx.com/forum/index.php?...c=419&st=36

А теперь отчет с моими новыми изменениями
1. NodesToPatch - пустой
Входное устройство только одно, но с автодетектом на оба микрофона. В префпанели регуляторы рассчитаны только на внешний - явная ошибка алгоритма, регуляторы должны учитывать автодетект, т.е. просматривать усилители по всем веткам цепочки.
Click to view attachment
Вот дампы в этой ситуации Click to view attachment
2. Теперь искусственно делаю патчи в инфо-плисте
CODE
            <key>NodesToPatch</key>
            <array>
                <dict>
                    <key>Codec</key>
                    <integer>2</integer>
                    <key>Config</key>
                    <string>0x90a30150</string>
                    <key>Node</key>
                    <integer>12</integer>
                    <key>Type</key>
                    <integer>4</integer>
                </dict>
                <dict>
                    <key>Codec</key>
                    <integer>2</integer>
                    <key>Config</key>
                    <string>0x40f000f1</string>
                    <key>Node</key>
                    <integer>19</integer>
                    <key>Type</key>
                    <integer>4</integer>
                </dict>
                <dict>
                    <key>Codec</key>
                    <integer>2</integer>
                    <key>Conns</key>
                    <integer>19</integer>
                    <key>Node</key>
                    <integer>23</integer>
                </dict>
                <dict>
                    <key>Codec</key>
                    <integer>2</integer>
                    <key>Conns</key>
                    <integer>12</integer>
                    <key>Node</key>
                    <integer>22</integer>
                </dict>
            </array>

т.е. переназначил ноды 12 и 19 и кто к ним присоединен.
Click to view attachment
Регулятор Monitor появился, но как выход?! Как-то мне кажется, что нужно было использовать Input Gain.
Вот дампы этой ситуации Click to view attachment

Результат все тот же - внутренний микрофон слышит только шипение, которое регулируется.
Зато панель Sound стала красивее
Click to view attachment
Ну и вот мои последние исходники, зачем нам svn, и так нормально.
Click to view attachment - ниже обновленные исходники
AutumnRain
QUOTE (Slice @ Aug 27 2009, 12:28 PM) *
А теперь отчет с моими новыми изменениями
1. NodesToPatch - пустой
Входное устройство только одно, но с автодетектом на оба микрофона. В префпанели регуляторы рассчитаны только на внешний - явная ошибка алгоритма, регуляторы должны учитывать автодетект, т.е. просматривать усилители по всем веткам цепочки.


Ты ошибаешься. Автодетект микрофонов отсуствует в текущей версии VoodooHDA.

CODE
nid=7 [audio input]
      |
      + <- nid=27 [audio selector] [src: mic, monitor]
             |
             + <- nid=24 [audio selector] [src: mic]
                    |
                    + <- nid=21 [audio selector] [src: mic]
                           |
                           + <- nid=14 [pin: Microphone (Black Jack)] [src: mic]
             + <- nid=19 [pin: Microphone (Fixed)] [src: monitor]



В этой схеме нода 27 будет получать сигнал только от ноды 24. Это следует из ее настроек:

CODE
nid: 27
           Name: audio selector
     Widget cap: 0x0030090d
                 LRSWAP STEREO
    Association: 1 (0x00004001)
            OSS: mic, monitor
     Output amp: 0x80000000
                 mute=1 step=0 size=0 offset=0
    connections: 3
          |
          + <- nid=24 [audio selector] (selected)
          + <- nid=19 [pin: Microphone (Fixed)]
          + [DISABLED] <- nid=20 [pin: Other (None)] [DISABLED]


Вход номер 0 с нодой 24 помечен как (selected).

QUOTE (Slice @ Aug 27 2009, 12:28 PM) *
2. Теперь искусственно делаю патчи в инфо-плисте
т.е. переназначил ноды 12 и 19 и кто к ним присоединен.


Опять ошибка. Ты не переназначал ноды, ты обманул драйвер VoodooHDA. Если таких соединений нет, то после патча драйвера они и не появятся. Патч нужен только в том случае если драйвер не верно определил соединение нод друг с другом. Драйвер VoodooHDA строит цепочки соединений нод с единственной целью: сформировать правильные регуляторы усиления сигнала на его пути от устройства до цифрового входа. На функционирование устройства - это ни как не влияет.
Slice
Но ты не сказал, а как правильно.

Я же объяснял, что экспериментируя с драйвером AppleHDA, я никак не мог добиться работы внутреннего микрофона, который в дампе обозначен нодой 19.
Из даташита следует, что это цифровой микрофон (?), т.е. обладающий высоким уровнем выходного сигнала ( не микровольты, а милливольты), потому и цепочка с ним короткая 7-24-19 либо 8-25-19. Не работает!
Успеха я добился, когда мне подсказали использовать 12 ноду для внутреннего микрофона. Рабочая цепочка
8-25-28-22-12
Т.е. физически это работает, все соединено именно так.
Именно поэтому я настойчиво ищу ошибку в драйвере ВудуХДА, в котором сделал точно такую цепочку, и даже уровни выставил. По всем дампам там все нормально. Но не звучит, в отличие от AppleHDA.

Насколько я помню, с ВудуХДА внутренний микрофон не работал ни у кого, только внешний.
А попробую-ка я назвать внутренний микрофон Голубым Внешним rolleyes.gif
AutumnRain
Попробуй сделать следующим образом.
VoodooHDA без патча. Рабочая цепочка для внешнего микрофона работает, звук слышен.
Отключи внешний микрофон, и спомощью скрипта переключи ноду 27 на вход 1

CODE
send_verb 0x21B70101


QUOTE (Slice @ Aug 27 2009, 02:19 PM) *
Успеха я добился, когда мне подсказали использовать 12 ноду для внутреннего микрофона. Рабочая цепочка
8-25-28-22-12
Т.е. физически это работает, все соединено именно так.


А документация говорит обратное. Просто в цепочки перечислены все необходимые ноды.
Меня занимает один вопрос: Меняет ли AppleHDA активные входы селекторов в зависимости от прописанной цепочки в настройках.
Скорее всего меняет. А VoodooHDA пока - нет. Надо научить его это делать и микрофоны будут работать.

QUOTE (Slice @ Aug 27 2009, 02:19 PM) *
Именно поэтому я настойчиво ищу ошибку в драйвере ВудуХДА, в котором сделал точно такую цепочку, и даже уровни выставил. По всем дампам там все нормально. Но не звучит, в отличие от AppleHDA.

Насколько я помню, с ВудуХДА внутренний микрофон не работал ни у кого, только внешний.
А попробую-ка я назвать внутренний микрофон Голубым Внешним rolleyes.gif


Как я уже говорил, проблема скорее в селекторах. Попробуй поиграть с ними используя скрипт send_verb

send_verb 0x21B70101

где
2 - номер адреса кодека
1B - номер ноды
701 - команда сменить вход
01 - порядковый номер входа
Slice
Сейчас буду пробовать.
Новые сведения: в патченном виде (нода 12) микрофон отзывается на ОЧЕНЬ сильные щелчки. Все регуляторы на максимуме.
Slice
Загрузил ВудуХДА с чистым инфо-плистом и запустил скрипт
CODE
#!/bin/sh

init()
{
REG_BASE=$(get_base_addr)
if [ "$(echo $REG_BASE | cut -b 7-)" == "00" ]
then
BASE_ADDR=$(echo $REG_BASE | cut -b 1-6)
VERB_OUTPUT_ADDR=0x${BASE_ADDR}60
VERB_INPUT_ADDR=0x${BASE_ADDR}64
VERB_STATUS_ADDR=0x${BASE_ADDR}68
else
echo "ERROR -- Unaligned base address." 1>&2
exit 1
fi
}

get_base_addr()
{
ioreg -d 1 -r -n $(ioreg -x | grep 'HDEF' | head -n 1 | cut -d 'o' -f 2- | cut -d '<' -f 1) -x | grep "IODeviceMemory" | cut -d '=' -f 3 | cut -d ',' -f 1 | cut -b 11-
}

set_verb()
{
sudo reggie_se -D PhysAddr -w "$1" -a ${VERB_OUTPUT_ADDR} -B 32
sudo reggie_se -D PhysAddr -w 1 -a ${VERB_STATUS_ADDR} -B 32 &> /dev/null
sudo reggie_se -D PhysAddr -r -a ${VERB_STATUS_ADDR} -B 32 &> /dev/null
sudo reggie_se -D PhysAddr -r -a ${VERB_INPUT_ADDR} -B 32 &> /dev/null
sudo reggie_se -D PhysAddr -w 2 -a ${VERB_STATUS_ADDR} -B 32 &> /dev/null
}

get_verb()
{
sudo reggie_se -D PhysAddr -w "$1" -a ${VERB_OUTPUT_ADDR} -B 32 &> /dev/null
sudo reggie_se -D PhysAddr -w 1 -a ${VERB_STATUS_ADDR} -B 32 &> /dev/null
sudo reggie_se -D PhysAddr -r -a ${VERB_STATUS_ADDR} -B 32 &> /dev/null
sudo reggie_se -D PhysAddr -r -a ${VERB_INPUT_ADDR} -B 32
sudo reggie_se -D PhysAddr -w 2 -a ${VERB_STATUS_ADDR} -B 32 &> /dev/null
}

init

# set_verb 0x00170500
# get_verb 0x001F0500
# set_verb 00837300
set_verb 0x21B70101

QUOTE
Password:
. 4.7.0 (244.4)
Memory Address - 0x00000000fe9fc060 (local)
Address 0xfe9fc060 0x21b70101 |0 0 1 0|0 0 0 1|1 0 1 1|0 1 1 1|0 0 0 0|0 0 0 1|0 0 0 0|0 0 0 1|

Шипение тут же прекратилось. Теперь, в полнейшей тишине, я уже слышу микрофон, но даже со всеми регуляторами на максимуме звук очень слабый.
Осталось сделать две вещи:
1. Вставить такую команду в драйвер, либо в инфо-плист как патч.
2. В ЭпплХДА есть параметр boost 0,1,2,3. Нам бы неплохо было иметь что-то подобное для предварительного усиления.

Еще любопытно, что у меня стерео-микрофон, т.е. две дырки, от каждой дырки звук идет в свое ухо. А в драйвере я видел, что для микрофона учитывается только левый канал. Или там одна регулировка сразу на оба?
Чтоб я без тебя делал?!

Теперь подключаю внешний микрофон. Автодетекта нет. Таким же скриптом переключаю обратно
0x21b70100
Чувствительность намного выше, регулятор в панели Sound можно поставить посередине, а в ВудуПреф вообще интересно:
чувствительность зависит от Recording level, а регулятор Mic меняет только уровень шумов. Поставил на минимум.

Однако неудобно вербами переключать, попробую с двумя устройствами поиграться.
AutumnRain
QUOTE (Slice @ Aug 27 2009, 03:53 PM) *
Сейчас буду пробовать.
Новые сведения: в патченном виде (нода 12) микрофон отзывается на ОЧЕНЬ сильные щелчки. Все регуляторы на максимуме.


Сильные щелчки говоришь... Знаешь на что это похоже....
У тебя есть программа GarageBand? Если есть, посмотри в ней сигнал от встроенного микрофона.
Дело в том, что встроенные микрофоны в отличии от внешних всегда МОНО. А соответствующая нода обрабатывает СТЕРЕО сигнал.
Если встроенный микрофон подцеплен на левый канал, то в правом будет только шум и тихое эхо левого канала. Возможно в панели настройки звука отображается уровень сигнала не в том канале, к которому подключен микрофон.
GarageBand позволяет увидеть сигнал обоих каналов независимо и выбрать формат входного сигнала (СТЕРЕО, МОНО(Левый), МОНО(Правый))

P.S. Ха! Пока я писал этот пост ты меня опередил! smile.gif
AutumnRain
QUOTE (Slice @ Aug 27 2009, 04:32 PM) *
Теперь подключаю внешний микрофон. Автодетекта нет. Таким же скриптом переключаю обратно
0x21b70100
Чувствительность намного выше, регулятор в панели Sound можно поставить посередине, а в ВудуПреф вообще интересно:
чувствительность зависит от Recording level, а регулятор Mic меняет только уровень шумов. Поставил на минимум.


Странно регулятор mic влияет только на сигнал от внешнего микрофона.
CODE
Microphone Volume (OSS: mic)
   |
   +- control  6 (nid  21 out):    +0/+40dB (5 steps)


Сигнал от внешнего микрофона проходит на две ноды больше. Соотвественно на два усилителя больше.

CODE
control  6 (nid  21 out):    +0/+40dB (5 steps)
control  9 (nid  24 in   0): +0/+21dB (15 steps)


При установках на максимум сигнал от внешнего микрофона усилиться на лишних 61 dB

P.S. Еще раз напомню посмотри уровень сигнала через GarageBand, может еще и в этом дело.
Slice
Извини, но я не умею работать с гаражом. Я включаю QuickTime Audio Recording, но там индикатор моно, отзывается на оба канала.
Сделал патч в инфо-плисте:
CODE
            <key>NodesToPatch</key>
            <array>
                <dict>
                    <key>Codec</key>
                    <integer>2</integer>
                    <key>Conns</key>
                    <integer>24</integer>
                    <key>Node</key>
                    <integer>27</integer>  -- отцепить ноду 19 от селектора 27, остается только 24
                </dict>
                <dict>
                    <key>Codec</key>
                    <integer>2</integer>
                    <key>Config</key>
                    <string>0x90a60140</string>  -- меняю группу (ассоциацию), чтобы устройство было отдельным, а не спаренным
                    <key>Node</key>
                    <integer>19</integer>
                    <key>Type</key>
                    <integer>4</integer>
                </dict>
            </array>

Теперь у меня есть два микрофона, у каждого свои регулировки.
Внешний работает замечательно, как и раньше.
Внутренний имеет фиксированную чувствительность, не зависящую ни от чего.
CODE
Record:

    nid=8 [audio input]
      |
      + <- nid=28 [audio selector] [src: monitor]
             |
             + <- nid=19 [pin: Microphone (Fixed)] [src: monitor]

+-------------------------+
| DUMPING Volume Controls |
+-------------------------+

Master Volume (OSS: vol)
   |
   +- control  4 (nid   5 out):    -95/+0dB (128 steps) + mute

PCM Volume (OSS: pcm)
   |
   +- control  4 (nid   5 out):    -95/+0dB (128 steps) + mute

Microphone2 Volume (OSS: monitor)
   |
   +- control 13 (nid  28 out):    mute

Recording Level (OSS: rec)
   |
   +- control 13 (nid  28 out):    mute

OSS mixer initialization...
Registering PCM channels...

А в ЭпплХДА я его регулировал... Даже странно. Сейчас вернусь и перепроверю.
AutumnRain
Между прочим в ноде 28 по умолчанию выбран 0 вход. А нода 19 подключена к 1 входу.
Чтобы сигнал с 19 ноды проходил к цифровому входу 8 нужно выполнить
CODE
send_verb 0x21С70101


А потом, судя по твоем дампу в цепочки 8->28->19 усилителей нет (у ноды 28 вообще-то есть, но он может быть либо включен, либо выключен, а усиления нет.)


Можешь прислать полную версию схемы?
Как сделать HDA звук, Патчим вручную (пост 11)
Slice
Ну вот ЭпплХДА. Прекрасная слышимость и чувствительность
Click to view attachment
Click to view attachment
Вот только он стал моно!!!

Еще одно - на картинке видишь тип устройства, а в ВудуХДА колонка пустая, комментарии типа "non-implemented"
Slice
Снова вернулся с ВудуХДА с длинной цепочкой. Вот что в систем-логе
QUOTE
Aug 27 18:12:15 HackBook-2 kernel[0]: VoodooHDADevice[0x242db000]::init
Aug 27 18:12:15 HackBook-2 kernel[0]: VoodooHDADevice::mixerSetDefaults
Aug 27 18:12:15 HackBook-2 kernel[0]: warning: couldn't set recording source to microphone
Aug 27 18:12:15 HackBook-2 kernel[0]: createPrefPanelStruct: audioControl 1 ossmask = 0x00000011
Aug 27 18:12:15 HackBook-2 kernel[0]: VoodooHDADevice::mixerSetDefaults
Aug 27 18:12:15: --- last message repeated 1 time ---
Aug 27 18:12:15 HackBook-2 kernel[0]: warning: couldn't set recording source to microphone
Aug 27 18:12:15 HackBook-2 kernel[0]: VoodooHDADevice::mixerSetDefaults
Aug 27 18:12:15 HackBook-2 kernel[0]: warning: couldn't set recording source to microphone
Aug 27 18:12:15 HackBook-2 kernel[0]: createPrefPanelStruct: audioControl 1 ossmask = 0x00000011
Aug 27 18:12:15 HackBook-2 kernel[0]: createPrefPanelStruct: audioControl 6 ossmask = 0x00000080
Aug 27 18:12:15 HackBook-2 kernel[0]: createPrefPanelStruct: audioControl 9 ossmask = 0x00000880
Aug 27 18:12:15 HackBook-2 kernel[0]: createPrefPanelStruct: audioControl 12 ossmask = 0x00000880
Aug 27 18:12:15 HackBook-2 kernel[0]: createPrefPanelStruct: audioControl 4 ossmask = 0x00000011
Aug 27 18:12:15 HackBook-2 kernel[0]: createPrefPanelStruct: audioControl 7 ossmask = 0x01000000
Aug 27 18:12:15 HackBook-2 kernel[0]: createPrefPanelStruct: audioControl 10 ossmask = 0x01000800
Aug 27 18:12:15 HackBook-2 kernel[0]: createPrefPanelStruct: audioControl 13 ossmask = 0x01000800
Aug 27 18:12:15 HackBook-2 kernel[0]: dacNid = 2, outputNid = 3, devType = Digital-out, connType = Jack name=pin: Digital-out (Jack)
Aug 27 18:12:15 HackBook-2 kernel[0]: warning: found invalid min/max dB (using default 0-40dB range)
Aug 27 18:12:15 HackBook-2 kernel[0]: dacNid = 2, outputNid = 13, devType = Speaker, connType = Fixed name=pin: Speaker (Fixed)
Aug 27 18:12:15 HackBook-2 kernel[0]: dacNid = 7, outputNid = 14, devType = Microphone, connType = Jack name=pin: Microphone (Black Jack)
Aug 27 18:12:15 HackBook-2 kernel[0]: dacNid = 5, outputNid = 15, devType = Line-out, connType = Jack name=pin: Line-out (Black Jack)
Aug 27 18:12:15 HackBook-2 kernel[0]: dacNid = 8, outputNid = 12, devType = Microphone, connType = Fixed name=pin: Microphone (Fixed)
Aug 27 18:12:15 HackBook-2 kernel[0]: warning: found invalid min/max dB (using default 0-40dB range)
Aug 27 18:12:15 HackBook-2 kernel[0]: dacNid = 30, outputNid = 33, devType = Digital-out, connType = Fixed name=pin: Digital-out (Fixed)
Aug 27 18:12:15 HackBook-2 kernel[0]: warning: found invalid min/max dB (using default 0-40dB range)

И соответственно в дампе
CODE
OSS mixer initialization...   -- это для цепочки 7-27-24-21-14
Recsel (mic): nid 21 source 0 select
Recsel (mic): nid 27 source 0 select
Registering PCM channels...
А теперь вторая цепочка
Record:

    nid=8 [audio input]
      |
      + <- nid=28 [audio selector] [src: monitor]
             |
             + <- nid=25 [audio selector] [src: monitor]
                    |
                    + <- nid=22 [audio selector] [src: monitor]
                           |
                           + <- nid=12 [pin: Microphone (Fixed)] [src: monitor]

+-------------------------+
| DUMPING Volume Controls |
+-------------------------+

Master Volume (OSS: vol)
   |
   +- control  4 (nid   5 out):    -95/+0dB (128 steps) + mute

PCM Volume (OSS: pcm)
   |
   +- control  4 (nid   5 out):    -95/+0dB (128 steps) + mute

Microphone2 Volume (OSS: monitor)
   |
   +- control  7 (nid  22 out):    +0/+40dB (5 steps)
   +- control 13 (nid  28 out):    mute

Recording Level (OSS: rec)
   |
   +- control 10 (nid  25 in   0): +0/+21dB (15 steps)
   +- control 13 (nid  28 out):    mute

OSS mixer initialization...
Registering PCM channels...

Нету recsel!!!
AutumnRain
QUOTE (Slice @ Aug 27 2009, 06:21 PM) *
Нету recsel!!!


Чего нет??
Slice
QUOTE (AutumnRain @ Aug 27 2009, 02:26 PM) *
Чего нет??

На рабочей цепочке есть это
CODE
Recsel (mic): nid 21 source 0 select
Recsel (mic): nid 27 source 0 select

на нерабочей этого нет, и причина простая
CODE
    if (audioCtlOssMixerSetRecSrc(pcmDevice, SOUND_MASK_MIC) == 0)
        errorMsg("warning: couldn't set recording source to microphone\n");

т.е микрофон типа монитора в пролете. На сегодня я ухожу, продолжу завтра.
AutumnRain
QUOTE (Slice @ Aug 27 2009, 06:57 PM) *
На рабочей цепочке есть это
CODE
Recsel (mic): nid 21 source 0 select
Recsel (mic): nid 27 source 0 select

на нерабочей этого нет, и причина простая
CODE
    if (audioCtlOssMixerSetRecSrc(pcmDevice, SOUND_MASK_MIC) == 0)
        errorMsg("warning: couldn't set recording source to microphone\n");

т.е микрофон типа монитора в пролете.



тут явно нужно сделать
CODE
    if (audioCtlOssMixerSetRecSrc(pcmDevice, SOUND_MASK_MIC + SOUND_MASK_MONITOR) == 0)
        errorMsg("warning: couldn't set recording source to microphone\n");


QUOTE (Slice @ Aug 27 2009, 06:57 PM) *
На сегодня я ухожу, продолжу завтра.


Отлично поработали. smile.gif
До завтра
Slice
QUOTE (AutumnRain @ Aug 27 2009, 04:12 PM) *
тут явно нужно сделать
CODE
    if (audioCtlOssMixerSetRecSrc(pcmDevice, SOUND_MASK_MIC + SOUND_MASK_MONITOR) == 0)
        errorMsg("warning: couldn't set recording source to microphone\n");

Вроде очевидно, но нужно проверить нюансы.
QUOTE
Отлично поработали. smile.gif
До завтра

Пока шел домой сообразил уже мою ошибку: патчи из инфо-плиста вносятся ПОСЛЕ установки свойств цепочек. Завтра буду проверять.
Кстати, там в драйвере заложены патчи для некоторых кодеков. Наверно, я их уберу совсем, кому надо, сделает это через инфо-плисты. У нас вроде для этого все есть. И не факт, что те патчи правильные.

Да, ты просил схему, она есть в моем даташите, который вложен в архив с моими дампами в соседней теме
копирую линк здесь http://www.projectosx.com/forum/index.php?...post&id=320
Slice
Не знаю, что делать с этим. Вроде все правильно, но в правой колонке нет типа устройства.
CODE
// xxx: there must be some way to get port name to appear in the "type" column on the sound
// preference pane - this used to be the "port" column but apparently this is no longer the
// case in recent releases of os x

portName = mPortName;
ASSERT(portName);

if (getEngineDirection() == kIOAudioStreamDirectionOutput) {
portType = kIOAudioPortTypeOutput;
// TODO: subType
subType = kIOAudioOutputPortSubTypeInternalSpeaker;
}
else {
portType = kIOAudioPortTypeInput;
// TODO: subType
subType = kIOAudioInputPortSubTypeInternalMicrophone;
}
mPort = IOAudioPort::withAttributes(portType, portName, subType);
if (!mPort) {
errorMsg("error: IOAudioPort::withAttributes failed\n");
goto done;
}
ret = mDevice->attachAudioPort(mPort, this, NULL);
if (ret != kIOReturnSuccess) {
errorMsg("error: attachAudioPort failed\n");
goto done;
}
В IOAudioFamily можно посмотреть, что это за процедура
CODE
IOAudioPort *IOAudioPort::withAttributes(UInt32 portType, const char *portName, UInt32 subType, OSDictionary *properties)
{
IOAudioPort *port;

port = new IOAudioPort;
if (port) {
if (!port->initWithAttributes(portType, portName, subType, properties)) {
port->release();
port = 0;
}
}

return port;
}

bool IOAudioPort::initWithAttributes(UInt32 portType, const char *portName, UInt32 subType, OSDictionary *properties)
{
if (!init(properties)) {
return false;
}

if (portType == 0) {
return false;
}

audioDevice = 0;
isRegistered = false;

setType(portType);

if (portName != 0) {
setName(portName);
}

if (subType != 0) {
setSubType(subType);
}

audioControls = OSSet::withCapacity(1);
if (!audioControls) {
return false;
}

return true;
}

Имя присваивается нормально, а тип - нет. В чем дело?

Над остальными ошибками работаю.
AutumnRain
2 Slice
Сегодня доступа к компу с MAC OS у меня нет, так что буду просто следить за твоими успехами. smile.gif

На мой взгляд в драйвер нужно добавить следующее:

1. Сделать автодетект для микрофонов
2. Встроенный микрофон должен быть моно (возможно сделать соответствующий переключатель в PrefPanel)
3. Сделать возможно задавать VREF для нод микрофонов в Info.plist (или в PrefPanel)
4. Научить драйвер сохранять настройки регуляторов (даже если PrefPanel не установлена в системе)
5. Предусмотреть возможность менять имя устройств и их тип в info.plist
Slice
QUOTE (AutumnRain @ Aug 28 2009, 07:49 AM) *
2 Slice
Сегодня доступа к компу с MAC OS у меня нет, так что буду просто следить за твоими успехами. smile.gif

На мой взгляд в драйвер нужно добавить следующее:

1. Сделать автодетект для микрофонов

Я посмотрел, как устроен автодетект наушников, и у меня волосы стали дыбом. Хотя я знаю команды переключения, но многого остального пока не понял. Но сделать надо.
QUOTE
2. Встроенный микрофон должен быть моно (возможно сделать соответствующий переключатель в PrefPanel)

Это почему это? Физически он у меня стерео, а в драйвере не вижу проблем. Сейчас перепроверю.
QUOTE
3. Сделать возможно задавать VREF для нод микрофонов в Info.plist (или в PrefPanel)
Я вроде научил драйвер выставлять мин/макс для других входов, кроме микрофона, а куда приложить это значение?
QUOTE
4. Научить драйвер сохранять настройки регуляторов (даже если PrefPanel не установлена в системе)
Сохранять на случай выхода из системы? Наверно можно, только я пока не увидел, где задаются начальные значения.
QUOTE
5. Предусмотреть возможность менять имя устройств и их тип в info.plist

Вроде не сложно.
mPortName = NodesToPatch[nid].name
Вот только смущает кодировка русского языка, если это имя еще где-то использовать.
Или ввести два имени - EnglishName и LocaleName?
Прикольно, но не самое нужное в данный момент.

Еще одно нужно сделать
6. При автодетекте наушников менять имя устройства в контрольной панели. ЭпплХДА это делает.

Что сделано на сей момент:
- Recsel теперь срабатывает по всем нодам обоих цепочек. Вставил и забытый connsenable при патче.
- Патч теперь делает до создания цепочек контроля
- Удалил предопределенные патчи для некоторых кодеков. Например ALC883. Лучше вручную сделаю тоже самое, если сочту необходимым.
- вычисление мин/мах дВ для всех видов входов. Вроде нормально отрабатывает.
В дампах обе цепочки теперь одинаковы, но внутренний микрофон по-прежнему не звучит.
В систем-логе вижу
QUOTE
Aug 28 14:20:46 HackBook-2 kernel[0]: VoodooHDADevice::mixerSetDefaults
Aug 28 14:20:46 HackBook-2 kernel[0]: VoodooHDADevice[0x23586000]::audioCtlOssMixerSetRecSrc(0x3fe9ebc, 0x10001c0)
Aug 28 14:20:46 HackBook-2 kernel[0]: warning: couldn't set recording source to input

Буду вставлять дополнительные логи, чтобы выяснить причину. Или это нормально?
А у тебя есть возможность видеть исходники, о чем я говорю?
AutumnRain
QUOTE (Slice @ Aug 28 2009, 03:22 PM) *
Я посмотрел, как устроен автодетект наушников, и у меня волосы стали дыбом. Хотя я знаю команды переключения, но многого остального пока не понял. Но сделать надо.


Я могу это сделать.

QUOTE (Slice @ Aug 28 2009, 03:22 PM) *
Это почему это? Физически он у меня стерео, а в драйвере не вижу проблем. Сейчас перепроверю.


А у меня он физически - моно. Да и тебя сигнал левого и правого канала идентичные. Кстати AppleHDA тоже считает твой встроенный микрофон - моно.

QUOTE (Slice @ Aug 28 2009, 03:22 PM) *
Я вроде научил драйвер выставлять мин/макс для других входов, кроме микрофона, а куда приложить это значение?


Ты говоришь о настройках усилителя? Который в dB измеряется?
А я говорю о настройках микрофона. Тот который может быть GROUND, 50%, 80%, 100% и т.д.

QUOTE (Slice @ Aug 28 2009, 03:22 PM) *
Сохранять на случай выхода из системы? Наверно можно, только я пока не увидел, где задаются начальные значения.


Представь пользователь настрой регуляторы на панели PrefPanel и перезагрузил комп. Настройки опять сбросяться на умолчальные. Значение по умолчанию храняться в Tables.c в таблице const UInt16 gMixerDefaults[SOUND_MIXER_NRDEVICES]

QUOTE (Slice @ Aug 28 2009, 03:22 PM) *
Вроде не сложно.
mPortName = NodesToPatch[nid].name
Вот только смущает кодировка русского языка, если это имя еще где-то использовать.
Или ввести два имени - EnglishName и LocaleName?
Прикольно, но не самое нужное в данный момент.


Хм, русский язык... Думаешь будут проблемы? Вроде имя больше нигде не фигурирует. И потом можно на Unicode написать.

QUOTE (Slice @ Aug 28 2009, 03:22 PM) *
Еще одно нужно сделать
6. При автодетекте наушников менять имя устройства в контрольной панели. ЭпплХДА это делает.


Да. Хорошая идея. smile.gif

QUOTE (Slice @ Aug 28 2009, 03:22 PM) *
Что сделано на сей момент:
- Recsel теперь срабатывает по всем нодам обоих цепочек. Вставил и забытый connsenable при патче.
- Патч теперь делает до создания цепочек контроля
- Удалил предопределенные патчи для некоторых кодеков. Например ALC883. Лучше вручную сделаю тоже самое, если сочту необходимым.


Может лучше оставить. Хочется чтобы драйвером пользовались и новечки тоже. А это значит, чтобы драйвер работал без доп. настроек. Установил в систему и он работает.

QUOTE (Slice @ Aug 28 2009, 03:22 PM) *
- вычисление мин/мах дВ для всех видов входов. Вроде нормально отрабатывает.
В дампах обе цепочки теперь одинаковы, но внутренний микрофон по-прежнему не звучит.
В систем-логе вижу

Буду вставлять дополнительные логи, чтобы выяснить причину. Или это нормально?


Не знаю.
А почему внутренний микрофон не звучит? Раньше тебе удавалось добиться его работы. Он был мало чувствительным, но работал.
Возможно стоит попробовать настроить работу с нодой 19. Ведь имеено ее драйвер по умолчанию считает микрофоном.


QUOTE (Slice @ Aug 28 2009, 03:22 PM) *
А у тебя есть возможность видеть исходники, о чем я говорю?


Есть. smile.gif
Slice
QUOTE (AutumnRain @ Aug 28 2009, 12:16 PM) *
Я могу это сделать.

Тогда надеюсь на тебя. Делаешь на любых исходниках, а я вставлю в свои исправленные. Потом согласуем окончательную версию.
QUOTE
А у меня он физически - моно. Да и тебя сигнал левого и правого канала идентичные. Кстати AppleHDA тоже считает твой встроенный микрофон - моно.

Ничего идентичного, щелок по левой дырке приходит в левое ухо, по правой - в правое. А вот Эппл - действительно в оба.
QUOTE
Ты говоришь о настройках усилителя? Который в dB измеряется?
А я говорю о настройках микрофона. Тот который может быть GROUND, 50%, 80%, 100% и т.д.
Мысль понятная, но мой вопрос - а куда это значение всунуть?
А через вербу его нельзя послать?
QUOTE
Представь пользователь настрой регуляторы на панели PrefPanel и перезагрузил комп. Настройки опять сбросяться на умолчальные. Значение по умолчанию храняться в Tables.c в таблице const UInt16 gMixerDefaults[SOUND_MIXER_NRDEVICES]

И где их сохранить? в файле? в НВРАМ? Мне что-то кажется, что префпанель сохраняет. Вот эта новая версия. Сейчас проверю
QUOTE
Хм, русский язык... Думаешь будут проблемы? Вроде имя больше нигде не фигурирует. И потом можно на Unicode написать.
Еще в префпанели. Надо же, чтоб имена совпадали!
QUOTE
Может лучше оставить. Хочется чтобы драйвером пользовались и новечки тоже. А это значит, чтобы драйвер работал без доп. настроек. Установил в систему и он работает.
Да вот не верю я этим патчам, во всяком случае для моего ALC883 с этими патчами ничего хорошего не получилось. Как мы выяснили на Эплайфе, кодеки одинаковые, а драйвера нужны разные. Так что заложенные патчи помогут единицам, а другим только напортят, независимо новичок он или хакер. Кроме того, можно написать инструкции, какие патчи были предусмотрены, и как их заложить в инфо-плист.
QUOTE
Не знаю.
А почему внутренний микрофон не звучит? Раньше тебе удавалось добиться его работы. Он был мало чувствительным, но работал.
Возможно стоит попробовать настроить работу с нодой 19. Ведь имеено ее драйвер по умолчанию считает микрофоном.

Как 19 нода он и сейчас потихоньку работает, но на нее по даташиту не предусмотрено усилителя, и перекоммутировать нельзя. А вот как 12 ноду сигнал можно усилить. Стоп!
А каким образом реальное устройство (разъем) связано с нодой или с пинконфигом? Может нужна команда на подключение/привязку?
Если связь только через пинКонфиг, то я все сделал.

PS Новая префпанель сохраняет настройки выхода PCM, но не сохраняет настройки микрофона.
Clubber_77
QUOTE (Clubber_77 @ Aug 28 2009, 05:02 PM) *
можно!!!


у меня микрофоны имено так и работают! режим VREFs задается через вербу
у меня она выглядит вот так 01770721 и жестко забита в пинконфиг!


выделено:
Оранжевым- номер ноды
Красным -команда Pin Widget Control
Зеленым - само значение (в линуксе Pin-ctls: 0x21: IN VREF_50
в VoodooHDA: Pin control: 0x00000021 IN VREFs )
p.s.
Сорри, не ту кнопку нажал.
Slice
QUOTE (Clubber_77 @ Aug 28 2009, 01:04 PM) *
у меня микрофоны имено так и работают! режим VREFs задается через вербу
у меня она выглядит вот так 01770721 и жестко забита в пинконфиг!


выделено:
Оранжевым- номер ноды
Красным -команда Pin Widget Control
Зеленым - само значение (в линуксе Pin-ctls: 0x21: IN VREF_50
в VoodooHDA: Pin control: 0x00000021 IN VREFs )
p.s.
Сорри, не ту кнопку нажал.

Спасибо! Очень ценная информация. Но ты опоздал на три минуты.
У меня заработал внутренний микрофон!!!!! sleep.gif rolleyes.gif biggrin.gif tongue.gif
Все дело оказалось в Пинконфиге
19 нода была прописана nid 19 0x90a6012e
Меня заинтересовала 4-я цифра 6 - Other Digital
Сейчас я поменял на 7 - Other Analog
Еще я отменил коннектор 12 для ноды 22, ибо он там и так есть.
Повлияло все же назначение ноды. 7-ка у меня стояла в ЭпплХДА.
Теперь все!
Драйвер рабочий, можно его улучшать косметически и писать инструкции для других.
Click to view attachment
А можно и скомпилировать под Барсика.
Click to view attachment
Click to view attachment
Click to view attachment
AutumnRain
QUOTE (Slice @ Aug 28 2009, 05:30 PM) *
Спасибо! Очень ценная информация. Но ты опоздал на три минуты.
У меня заработал внутренний микрофон!!!!! sleep.gif rolleyes.gif biggrin.gif tongue.gif


Ура!!! biggrin.gif

Давай я его в первый пост перевыложу.
Чего в change log написать?
Slice
QUOTE (AutumnRain @ Aug 28 2009, 01:37 PM) *
Ура!!! biggrin.gif

Ты поработай над шапкой этой темы, а я пойду докладывать на Мировую сцену.
Ну и жду твоих дополнений в исходники, если можешь.

В change-log: исправлена работа с внутренним микрофоном.
Насчет line-in не проверял, но тоже подправил.
Более существенно, это инструкции чего патчить, и для чего. Я буду составлаять детальный отчет:
1. Что без патча, и что не устраивает
2. Почему нужен такой патч, и что при этом получил.

Теперь о дампах. А ты не мог бы совместить getdump и getExtDump в одно целое? А то избыточная информация получается.
В победном дампе я не вижу особых отличий от нерабочей версии. Пинконфиг да коннекторы. А вот звучания там не очевидно.
AutumnRain
QUOTE (Slice @ Aug 28 2009, 05:42 PM) *
Ты поработай над шапкой этой темы, а я пойду докладывать на Мировую сцену.
Ну и жду твоих дополнений в исходники, если можешь.


А что именно в шапке не так?

А дополнение - это дело не быстрое. Буду потихоньку делать и выкладывать. Главное, чтобы все работало.

QUOTE (Slice @ Aug 28 2009, 05:42 PM) *
Теперь о дампах. А ты не мог бы совместить getdump и getExtDump в одно целое? А то избыточная информация получается.


Это можно.

QUOTE (Slice @ Aug 28 2009, 05:42 PM) *
В победном дампе я не вижу особых отличий от нерабочей версии. Пинконфиг да коннекторы. А вот звучания там не очевидно.


А чего бы ты хотел? Просто ради примера, как по твоему должен выглядить дамп?
Slice
QUOTE (AutumnRain @ Aug 28 2009, 01:56 PM) *
А что именно в шапке не так?
Я сейчас сделаю отчет, как я догадался. что имеено патчить, а ты помести в шапку ссылку на него.
Драйвер -это мало, нужно уметь им пользоваться. С чистым инфо-плистом у меня нет внутреннего микрофона, автодетект-то отсутствует!
QUOTE
А дополнение - это дело не быстрое. Буду потихоньку делать и выкладывать. Главное, чтобы все работало.
Очень на тебя надеюсь по двум пунктам: автодетект микрофона, и смена имени устройства при автодетекте. Последнее я, пожалуй, и сам могу сообразить, но тебе же все-равно по пути.
QUOTE
А чего бы ты хотел? Просто ради примера, как по твоему должен выглядить дамп?

Как раньше getdump, но с твоими добавками.
Работоспособность, конечно, не видна, но все же, о многом можно судить.
Slice
Итак, отчитываюсь, как сделать полностью рабочий драйвер на примере своего Sigmatel 9228. Позже испытаю на ALC883.
1. Устанавливаю драйвер с чистым списком NodesToPatch.
Выходные устройства заработали все. Причем левая дырка работает с автодетектом Спикер <-> Наушники.
В текущей версии драйвера в контрольной панели отображается только спикер
Click to view attachment
Входное устройство работает только одно - внешний микрофон.
Click to view attachment
Но я знаю, что у меня есть еще и встроенный микрофон. Где он?
2. Набираю в терминале команду
getdump >HDADumpNoPatch.txt
Вот этот файл целиком Click to view attachment
3. Там много интересной информации, я сейчас ищу микрофон
CODE
Probing codec #2... -- да мое звуковое устройство находится на адресе 2 (при патче нужно учесть)
HDA Codec #2: Sigmatel STAC9228X
HDA Codec ID: 0x83847616

nid 14 0x02a11020 as 2 seq 0 Microphone Jack jack 1 loc 2 color Black misc 0
nid 19 0x90a6012e as 2 seq 14 Microphone Fixed jack 6 loc 16 color Unknown misc 1

Итак, драйвер видит два микрофона, внутренний (Fixed) и внешний (Jack), сидящие в одной группе 2 (красная цифра).
Смотрим соединения
CODE
Record:

    nid=7 [audio input]
      |
      + <- nid=27 [audio selector] [src: mic, monitor]
             |
             + <- nid=24 [audio selector] [src: mic]
                    |
                    + <- nid=21 [audio selector] [src: mic]
                           |
                           + <- nid=14 [pin: Microphone (Black Jack)] [src: mic]  -- это внешний
             + <- nid=19 [pin: Microphone (Fixed)] [src: monitor]  -- а это внутренний

Внешний микрофон проходит через дополнительные усилители 21 и 24, и через оконечный усилитель 27 выходит на АЦП 7 (Аналого-Цифровой Преобразователь). Он имеет более высокий приоритет, потому изначально подключен.
Внутренний микрофон соединен напрямую с усилителем 27.
Проблема №1 - в текущей версии драйвера нет автодетекта микрофона, поэтому он никогда не подключается.
Подключить можно вручную командой send_verb 0x21B70101. Я это сделал, и убедился, что микрофон работает, но чевствительность очень низка, и не регулируется.
Проблема №2 - Согласно даташита нода 19 именно так и подключена, и предназначена для цифрового микрофона с высоким уровнем сигнала, потому и не нуждается в дополнительных усилителях. Ее ПинДефолт = 0x90a6012e
90 - Внутреннее соединение
а - микрофон
6 - цифровой
0 - неопределнного цвета
1 - фиксированный
2 - входит во вторую группу
e - приоритет ( 0 - самый высокий)
Оказывается, сборщики компьютера воткнули туда обычный аналоговый микрофон с низкой чувствительностью.
2. Решение этих проблем находим в возможности прописать в инфо-плисте драйвера NodesToPatch.
Чтобы обойти автодетект микрофона, его просто нужно перевести в другую группу. Свободна у меня 4, что можно проследить по этому дампу.
Чтобы соединить микрофон со входными усилителем, ему нужно назначить другую ноду. По даташиту узнаем, что есть еще 12 нода, которая в данный момент свободна. (Линукс дамп тоже показывает использование этой ноды для микрофона)
Чтобы сделать микрофон аналоговым, мы должны заменить цифру 6 на 7.
Ноду 19 стоит запретить, чтобы не было двух описаний одного устройства.
Поэтому пишем так
CODE
            <key>NodesToPatch</key>
            <array>
                <dict>
                    <key>Codec</key>
                    <integer>2</integer>  -- мой Адрес кодека
                    <key>Node</key>
                    <integer>12</integer>  -- ноду 12 определяем как
                    <key>Config</key>
                    <string>0x90a79140</string> -- встроенный аналоговый микрофон в 4-й группе
                </dict>
                <dict>
                    <key>Codec</key>
                    <integer>2</integer>
                    <key>Node</key>
                    <integer>19</integer>  -- ноду 19 переопределяем как
                    <key>Config</key>
                    <string>0x40f000f1</string>  -- неизвестное устройство в 15 группе, стандартное обозначение для такого случая
                </dict>
            </array>

И вот ожидаемый результат
Click to view attachment
Теперь в дампе можно убедиться, что микрофоны сидят в разных цепочках, и для встроенного подключены усилители
CODE
Record:

    nid=8 [audio input]
      |
      + <- nid=28 [audio selector] [src: monitor]
             |
             + <- nid=25 [audio selector] [src: monitor]
                    |
                    + <- nid=22 [audio selector] [src: monitor]
                           |
                           + <- nid=12 [pin: Microphone (Fixed)] [src: monitor]

В контрольной панели VoodooHDA.pref.panel можно отрегулировать его чувствительность и уровень выходного сигнала, и добиться чистого звука на фоне минимальных шумов
Click to view attachment
Slice
Я тут почесал репу, и подумал, а что, если у меня имеются как аналоговый моно-микрофон (12 нода), так и цифровой стерео (19 нода)? И подправил свой инфо-плист на 19 ноду конфиг 0x90a60150 - внутренний цифровой микрофон в 5-ой группе.
CODE
Record:

    nid=9 [audio input]
      |
      + <- nid=29 [audio selector] [src: line]
             |
             + <- nid=19 [pin: Microphone (Fixed)] [src: line]

Click to view attachment Click to view attachment
Да, чувствительность у него похуже, но что-то он слышит, и в отличие от аналогового, он стерео.

Нда, такого результата я с ЭпплХДА никогда не имел.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Invision Power Board © 2001-2012 Invision Power Services, Inc.