AAudio открытый поток занимает слишком много времени - PullRequest
0 голосов
/ 29 мая 2019

Я читаю стереофонические аудиоданные на 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 (которую я знаю, что она неприменима)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...