Я читаю стереофонические аудиоданные на Android с устройства, подключенного через USB, с помощью AAudio.Открытие потока (вызов AAudioStreamBuilder_openStream) занимает 10-15 секунд.Могу ли я уменьшить это?
Я адаптировал пример кода AAudio для успешной записи звука с устройства.Однако время запуска при открытии потока записи на устройство занимает 15 секунд на моем Samsung S9 и 10 секунд на моем Samsung S8.Поскольку пользователь может открыть приложение и сразу же попытаться выполнить запись, это слишком долго.
StreamBuilder AudioEngine::makeStreamBuilder()
{
AAudioStreamBuilder *builder = nullptr;
aaudio_result_t result = AAudio_createStreamBuilder(&builder);
if (result != AAUDIO_OK) {
__android_log_print(ANDROID_LOG_ERROR, __func__, "Failed to create stream builder %s (%d)",
AAudio_convertResultToText(result), result);
return StreamBuilder(nullptr, &AAudioStreamBuilder_delete);
}
return StreamBuilder(builder, &AAudioStreamBuilder_delete);
}
void AudioEngine::openRecordingDevice( int deviceId )
{
StreamBuilder recordingBuilder = makeStreamBuilder();
AAudioStreamBuilder_setDeviceId(recordingBuilder.get(), deviceId );
AAudioStreamBuilder_setDirection(recordingBuilder.get(), AAUDIO_DIRECTION_INPUT);
AAudioStreamBuilder_setPerformanceMode(recordingBuilder.get(), AAUDIO_PERFORMANCE_MODE_LOW_LATENCY);
AAudioStreamBuilder_setSharingMode(recordingBuilder.get(), AAUDIO_SHARING_MODE_EXCLUSIVE);
//AAudioStreamBuilder_setSharingMode(recordingBuilder.get(), AAUDIO_SHARING_MODE_SHARED);
AAudioStreamBuilder_setFormat(recordingBuilder.get(), AAUDIO_FORMAT_PCM_FLOAT);
AAudioStreamBuilder_setSampleRate(recordingBuilder.get(), 48000);
AAudioStreamBuilder_setChannelCount(recordingBuilder.get(), kChannelCountStereo);
AAudioStreamBuilder_setDataCallback(recordingBuilder.get(), ::recordingDataCallback, this);
AAudioStreamBuilder_setErrorCallback(recordingBuilder.get(), ::errorCallback, this);
struct timeval before, after, diff;
gettimeofday(&before, NULL);
result = AAudioStreamBuilder_openStream(recordingBuilder.get(), &mRecordingStream);
gettimeofday(&after, NULL);
timeval_subtract( &diff, &after, &before );
__android_log_print(ANDROID_LOG_DEBUG, "M2MAudioEngine", "open record stream took %ld", diff.tv_sec);
...
}
(Кстати, частота дискретизации 48000 подходит для этого устройства.)
ВремяКод подтверждает, как долго я ожидаю продолжения вывода logcat.
На S8 я вижу следующий вывод:
2019-05-29 10:40:27.982 24011-24011/com.example.myapp D/AAudio: AudioStreamBuilder(): mmapPolicy = 1, mapExclusivePolicy = 1
2019-05-29 10:40:27.982 24011-24011/com.example.myapp W/AAudio: AudioStreamBuilder(): EXCLUSIVE sharing mode not supported. Use SHARED.
2019-05-29 10:40:27.982 24011-24011/com.example.myapp I/AAudio: AudioStream::open() rate = 48000, channels = 2, format = 2, sharing = 1, dir = INPUT
2019-05-29 10:40:27.982 24011-24011/com.example.myapp I/AAudio: AudioStream::open() device = 11, perfMode = 12, callbackFrames = 0
2019-05-29 10:40:27.982 24011-24011/com.example.myapp D/AAudio: AudioStreamRecord::open(), request notificationFrames = 0, frameCount = 0
2019-05-29 10:40:33.299 24011-24011/com.example.myapp W/AudioRecord: AUDIO_INPUT_FLAG_FAST denied by server; frameCount 0 -> 2880
2019-05-29 10:40:38.603 24011-24011/com.example.myapp W/AAudio: AudioStreamRecord::open() flags changed from 0x00000005 to 0x00000000
2019-05-29 10:40:38.603 24011-24011/com.example.myapp W/AAudio: AudioStreamRecord::open() perfMode changed from 12 to 10
2019-05-29 10:40:38.605 24011-24011/com.example.myapp D/AAudio: AAudioStreamBuilder_openStream() returns 0 = AAUDIO_OK for (0x73f1b2a480) ----
------------
2019-05-29 10:40:38.605 24011-24011/com.example.myapp D/M2MAudioEngine: open record stream took 10
На S9 (который занимает около 5 секунд дольше) в середине есть дополнительный вывод:
2019-05-15 10:58:49.714 1728-1728/com.example.myapp I/AAudioStream: open() rate = 48000, channels = 2, format = 2, sharing = EX, dir = INPUT
2019-05-15 10:58:49.714 1728-1728/com.example.myapp I/AAudioStream: open() device = 11, sessionId = 0, perfMode = 12, callback: ON with frames = 0
2019-05-15 10:58:49.714 1728-1728/com.example.myapp I/AAudioStream: open() usage = 1, contentType = 2, inputPreset = 6
2019-05-15 10:59:00.333 1728-1728/com.example.myapp E/AAudio: BpAAudioService::client OPEN_STREAM passed stream -889
2019-05-15 10:59:00.333 1728-1728/com.example.myapp E/AudioStreamInternal_Client: open - openStream() returned -889
2019-05-15 10:59:00.333 1728-1728/com.example.myapp D/AAudioStream: destroying 0x73bec83600, state = AAUDIO_STREAM_STATE_UNINITIALIZED
2019-05-15 10:59:00.334 1728-1728/com.example.myapp I/AAudioStream: open() rate = 48000, channels = 2, format = 2, sharing = EX, dir = INPUT
2019-05-15 10:59:00.334 1728-1728/com.example.myapp I/AAudioStream: open() device = 11, sessionId = 0, perfMode = 12, callback: ON with frames = 0
2019-05-15 10:59:00.334 1728-1728/com.example.myapp I/AAudioStream: open() usage = 1, contentType = 2, inputPreset = 6
2019-05-15 10:59:05.661 1728-1728/com.example.myapp I/AudioRecord: AUDIO_INPUT_FLAG_FAST successful; frameCount 0 -> 4096
2019-05-15 10:59:05.662 1728-1728/com.example.myapp D/AudioStreamRecord: open() setup I16>FLOAT conversion buffer with 240 frames
2019-05-15 10:59:05.662 1728-1728/com.example.myapp W/AudioStreamRecord: open() flags changed from 0x00000005 to 0x00000001
2019-05-15 10:59:05.663 1728-1728/com.example.myapp D/AAudio: AAudioStreamBuilder_openStream() returns 0 = AAUDIO_OK for (0x73b671fc80) ----------------
2019-05-15 10:59:05.663 1728-1728/com.example.myapp D/M2MAudioEngine: open record stream took 15
Я понимаю из этой проблемы с Oboe (который оборачивает AAudio) https://github.com/google/oboe/issues/155, что есть попытка открыть устройство как «MMAP» (отображение памяти), которое истекло.Я не знаю, почему это происходит на S9, а не на S8.Я использую точно такое же внешнее устройство.
Мои вопросы: могу ли я уменьшить общую задержку открытия потока?Как я могу предотвратить дополнительную задержку MMAP (которую я знаю, что она неприменима)?