Как дать пустые данные для библиотеки гобоев для воспроизведения звука?

Иногда я хочу, чтобы мой аудиовыход в гобое ничего не воспроизводил, но я не хочу, чтобы он останавливался, я просто хочу, чтобы он молчал, пока не поступают данные. Я пытался:

static void writeBlankData(float* pointer, int numFrames) {
    std::fill_n(pointer, numFrames, 0);
}
oboe::DataCallbackResult PlayRecordingCallback::onAudioReady(
        oboe::AudioStream *audioStream,
        void *audioData,
        int numFrames) {
    float *floatData = (float *) audioData;
    writeBlankData(floatData, numFrames);
    return oboe::DataCallbackResult::Continue;
}

но я слышу гудение на аудиовыходе вместо тишины. Разве массив 0 не должен быть тишиной? Я пробовал также -1.0f, который дает другое жужжание.


person Lucas Zanella    schedule 19.08.2020    source источник


Ответы (1)


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

Попробуйте изменить:

writeBlankData(floatData, numFrames);

To:

writeBlankData(floatData, numFrames * audioStream->getChannelCount());
person donturner    schedule 25.08.2020
comment
Здравствуйте, Дон, запись пустых данных вызывает какие-либо накладные расходы? Например, расход заряда батареи и т. Д. В моем приложении я хочу воспроизводить звук только тогда, когда пользователь касается кнопки, чтобы получить минимальную задержку, должен ли я держать поток открытым и записывать только непустые данные, когда пользователь нажимает кнопку? - person cs guy; 04.11.2020
comment
Будет некоторое дополнительное потребление энергии, связанное с поддержанием потока открытым. У меня нет данных о том, сколько дополнительной мощности используется, но я не думаю, что это будет значительным по сравнению с сохранением экрана. - person donturner; 10.11.2020