Это сообщение является копией вопрос, который я задал в android-ndk googlegroups, который, к сожалению, до сих пор не получил никакого ответа. Я надеюсь, что я найду некоторые подсказки здесь. Благодарю.
Я пытаюсь настроить звуковую дорожку, которая будет воспроизводиться через динамик уха, используя OpenSL.
Таким образом, мне удалось использовать подход, описанный в Как настроить OpenSL для работы с наушниками, отличными от основного динамика или наушников
то есть путем настройки SL_IID_ANDROIDCONFIGURATION
использовать SL_ANDROID_STREAM_VOICE
,
Идея состоит в том, чтобы захватывать звук с микрофона и воспроизводить его через наушник. Поэтому я начинаю с проекта аудио-эха.
Однако в audio_player.cpp, строки 91-94, есть следующий комментарий:
/*
* create fast path audio player: SL_IID_BUFFERQUEUE and SL_IID_VOLUMEinterfaces ok,
* NO others!
*/
Я внес небольшие изменения в audio_player.cpp, чтобы пропустить звук через динамик уха (строки 94-98 изменены для следующего фрагмента)
SLInterfaceID ids[3] = { SL_IID_BUFFERQUEUE, SL_IID_VOLUME,
SL_IID_ANDROIDCONFIGURATION};
SLboolean req[3] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE,SL_BOOLEAN_TRUE};
result = (*slEngine)->CreateAudioPlayer(slEngine,
&playerObjectItf_, &audioSrc, &audioSnk,(ids)/sizeof(ids[0]), ids, req);
SLASSERT(result);
// Force the use of the earspeaker
SLAndroidConfigurationItf playerConfig;
result = (*playerObjectItf_)->GetInterface(playerObjectItf_,
SL_IID_ANDROIDCONFIGURATION, (void*)&playerConfig);
SLASSERT(result);
SLint32 streamType = SL_ANDROID_STREAM_VOICE;
result = (*playerConfig)->SetConfiguration(playerConfig,
SL_ANDROID_KEY_STREAM_TYPE,streamType, sizeof(SLint32));
SLASSERT(result);
Тем не менее, с LGE Nexus 4 API 22, я могу проверить через dumpsys media.audio_flinger
это аудио-эхо работает на ускоренном пути, что, по-моему, противоречит вышеупомянутому комментарию.
Фрагмент dumpsys media.audio_flinger (аудиоэхо работает с pid 4015)
// Output thread
...
4 Tracks of which 1 are active
Name Active Client Type Fmt Chn mask Session fCount S F SRate L dB R dB Server Main buf Aux Buf Flags UndFrmCnt
F 5 no 701 1 00000001 00000003 36 9065 S 1 48000 -inf -inf 00002369 0xb8caf900 0x0 0x600 0
F 3 yes 4015 0 00000001 00000001 51 480 A 1 48000 0 0 00063F60 0xb8caf900 0x0 0x400 0
F 1 no 547 1 00000001 00000003 49 4512 S 1 48000 -inf -inf 000011A0 0xb8caf900 0x0 0x600 0
F 2 no 547 1 00000001 00000003 52 4512 S 1 48000 -inf -inf 000011A0 0xb8caf900 0x0 0x600 0
0 Effect Chains
// Input Thread
Buffer size: 480 bytes
Fast capture thread: yes
Fast track available: no
...
1 Tracks of which 1 are active
Active Client Fmt Chn mask Session S Server fCount SRate
yes 4015 1 00000010 53 6 00064AA0 2048 48000
0 Effect Chains
Тот же результат, достигнутый с Motorola Nexus 6 API 23.
Поэтому мой первый вопрос об ограничениях для темы быстрого микшера при использовании SL_IID_ANDROIDCONFIGURATION
(и, возможно, другие интерфейсы проигрывателя)
Я не нашел никакой документации по этому вопросу.
С другой стороны, при запуске модифицированного аудио-эха с помощью внедренного Samsung Galaxy S5 API 21 механизм обратного вызова OpenSL молча не в состоянии передавать потоковое аудио.
Я добавил журналы сразу после bqPlayerCallback
а также bqRecorderCallback
, чтобы проверить обратные вызовы, и результат следующий (параметры очереди буфера такие же, как по умолчанию):
01-15 01:07:05.805 9722-11421/com.google.sample.echo D/AUDIO-ECHO: RECORDER CALLBACK
01-15 01:07:05.825 9722-11421/com.google.sample.echo D/AUDIO-ECHO: RECORDER CALLBACK
01-15 01:07:05.845 9722-11421/com.google.sample.echo D/AUDIO-ECHO: RECORDER CALLBACK
01-15 01:07:05.855 9722-11419/com.google.sample.echo D/AUDIO-ECHO: PLAYER CALLBACK
01-15 01:07:05.855 9722-11419/com.google.sample.echo D/AUDIO-ECHO: PLAYER CALLBACK
01-15 01:07:05.855 9722-11419/com.google.sample.echo D/AUDIO-ECHO: PLAYER CALLBACK
01-15 01:07:05.865 9722-11421/com.google.sample.echo D/AUDIO-ECHO: RECORDER CALLBACK
01-15 01:07:05.885 9722-11421/com.google.sample.echo D/AUDIO-ECHO: RECORDER CALLBACK
01-15 01:07:05.905 9722-11421/com.google.sample.echo D/AUDIO-ECHO: RECORDER CALLBACK
01-15 01:07:05.925 9722-11421/com.google.sample.echo D/AUDIO-ECHO: RECORDER CALLBACK
01-15 01:07:05.945 9722-11421/com.google.sample.echo D/AUDIO-ECHO: RECORDER CALLBACK
01-15 01:07:05.975 9722-11421/com.google.sample.echo D/AUDIO-ECHO: RECORDER CALLBACK
01-15 01:07:05.985 9722-11421/com.google.sample.echo D/AUDIO-ECHO: RECORDER CALLBACK
01-15 01:07:06.005 9722-11421/com.google.sample.echo D/AUDIO-ECHO: RECORDER CALLBACK
01-15 01:07:06.025 9722-11421/com.google.sample.echo D/AUDIO-ECHO: RECORDER CALLBACK
01-15 01:07:06.045 9722-11421/com.google.sample.echo D/AUDIO-ECHO: RECORDER CALLBACK
01-15 01:07:06.065 9722-11421/com.google.sample.echo D/AUDIO-ECHO: RECORDER CALLBACK
01-15 01:07:06.085 9722-11421/com.google.sample.echo D/AUDIO-ECHO: RECORDER CALLBACK
01-15 01:07:06.105 9722-11421/com.google.sample.echo D/AUDIO-ECHO: RECORDER CALLBACK
01-15 01:07:06.125 9722-11421/com.google.sample.echo D/AUDIO-ECHO: RECORDER CALLBACK
01-15 01:07:06.175 9722-11421/com.google.sample.echo D/AUDIO-ECHO: RECORDER CALLBACK
01-15 01:07:06.175 9722-11421/com.google.sample.echo D/AUDIO-ECHO: RECORDER CALLBACK
Моя интерпретация такова: все идет хорошо до первого обратного вызова игрока. В этот момент обратный вызов игрока вызывается 3 раза, как и ожидалось, но все обратные вызовы происходят в один и тот же момент.
После этого 16 успешных обратных вызовов рекордера, а затем в FreeQueue больше нет буферов, и обработка аудио останавливается.
Эта ситуация может быть что-то связанное с отсутствием прошлого пути …
Фрагмент dumpsys media.audio_flinger
(аудиоэхо работает с pid 6326):
// Output thread
...
2 Tracks of which 0 are active
Name Active Client Type Fmt Chn mask Session fCount S F SRate L dB R dB Server Main buf Aux Buf Flags UndFrmCnt
1 no 1218 5 1 00000003 12619 3528 S 1 44100 0 0 00007A56 0xb214a000 0x0 0x400 1768
0 no 6326 0 1 00000001 12718 3840 S 1 48000 0 0 00000000 0xb214a000 0x0 0x200 0
0 Effect Chains
// Input thread
No active record clients
Fast capture thread: no
Fast track available: no
...
1 Tracks of which 0 are active
Active Client Fmt Chn mask Session S Server fCount SRate
no 6326 1 00000010 12720 7 00004B00 2880 48000
0 Effect Chains
То же устройство, когда работает без (*playerConfig)->SetConfiguration(playerConfig, SL_ANDROID_KEY_STREAM_TYPE,streamType, sizeof(SLint32))
работает хорошо, с Fast Audio Path, и обратные вызовы первого игрока не мгновенные, как в предыдущем случае.
Это нормальное поведение, чтобы ожидать, или это имеет отношение к «особому» способу Самсунга иметь дело с вещами ??
Большое спасибо.
Лучший,
Андрес Перес
Задача ещё не решена.
Других решений пока нет …