0

I try playing audio that is stored at void * data with length data_size but get the message: "Got a buffer underflow!"

int callback(void * data, long data_size) {
  QBuffer audio_buffer;
  audio_buffer.setData(static_cast<const char*>(data), data_size);

  audio_buffer.open(QIODevice::ReadOnly);

  QAudioFormat format;
  format.setSampleSize(16);
  format.setSampleRate(44100);
  format.setChannelCount(1);
  format.setCodec("audio/pcm");
  format.setByteOrder(QAudioFormat::LittleEndian);
  format.setSampleType(QAudioFormat::SignedInt);

  // get default output device
  QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());

  // start playback
  QAudioOutput output(info, format);
  output.start(&audio_buffer);
  // ...then wait for the sound to finish
  QEventLoop loop;
  QObject::connect(&output, SIGNAL(stateChanged(QAudio::State)), &loop, SLOT(quit()));
  do {
    loop.exec();
  } while(output.state() == QAudio::ActiveState);
}
gro
  • 53
  • 11
  • How big is the buffer typically? With audio it is usually a small buffer that gets refilled continuously, yours is kind of strange, since you are only doing it once. – dtech Mar 29 '16 at 14:34
  • 1
    Do you hear audio? Is callback called more than once? This is a very surprising function... – UmNyobe Mar 29 '16 at 14:58
  • Yes, the callback is called multiple times. - If I write it to a file first and then play from file I hear audio but get a underrun, too. – gro Mar 29 '16 at 17:13
  • If the callback is called repeatedly, you should keep and reuse the configuration instead of recreating it on every call. – dtech Mar 29 '16 at 17:15
  • @gro Is this still an issue for you – lmat - Reinstate Monica Dec 01 '18 at 11:08
  • @LimitedAtonement, thanks for reaching out but it isn't anymore – gro Dec 02 '18 at 15:47

1 Answers1

0

Try some changes below

.pro file

QT+=  multimedia

also check if format is supported

  // get default output device
  QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());

  if (!info.isFormatSupported(format))
    format = info.nearestFormat(format);

  // start playback
  QAudioOutput output(info, format);
  output.start(&audio_buffer);
Mandar
  • 1,006
  • 11
  • 28