Android openSL: SL_IID_ANDROIDCONFIGURATION и Fast Audio Path

Это сообщение является копией вопрос, который я задал в android-ndk googlegroups, который, к сожалению, до сих пор не получил никакого ответа. Я надеюсь, что я найду некоторые подсказки здесь. Благодарю.

1-й вопрос: FastTrack создан даже с SL_IID_ANDROIDCONFIGURATION …


Я пытаюсь настроить звуковую дорожку, которая будет воспроизводиться через динамик уха, используя 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 (и, возможно, другие интерфейсы проигрывателя)
Я не нашел никакой документации по этому вопросу.

2-й вопрос: … но не в Samsung Galaxy S5


С другой стороны, при запуске модифицированного аудио-эха с помощью внедренного 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, и обратные вызовы первого игрока не мгновенные, как в предыдущем случае.

Это нормальное поведение, чтобы ожидать, или это имеет отношение к «особому» способу Самсунга иметь дело с вещами ??

Большое спасибо.

Лучший,

Андрес Перес

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]