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

#android #c #audio #oboe

#Android #c #Аудио #oboe

Вопрос:

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

 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 s не должен быть silence? Я также пробовал -1.0f , что дает другое жужжание.

Ответ №1:

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

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

 writeBlankData(floatData, numFrames);
  

Для:

 writeBlankData(floatData, numFrames * audioStream->getChannelCount());
  

Комментарии:

1. Привет, Дон, запись пустых данных вызывает какие-либо накладные расходы? Например, расход батареи и т.д. В моем приложении я хочу воспроизводить звук только тогда, когда пользователь нажимает кнопку, чтобы получить минимальную задержку, должен ли я держать поток открытым и записывать непустые данные только тогда, когда пользователь нажимает кнопку?

2. Будет некоторое дополнительное энергопотребление, связанное с сохранением потока открытым. У меня нет никаких данных о том, сколько дополнительной мощности используется, но я не думаю, что это существенно по сравнению с сохранением экрана включенным.