GEAudioOut.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /**
  2. *
  3. * GE::GA Qt Audio out
  4. * tuomo.hirvonen@digia.com
  5. *
  6. */
  7. #include <QtCore/qstring.h>
  8. //#include <QtMultimedia/qaudiooutput.h>
  9. //#include <QtMultimedia/qaudioformat.h>
  10. #include <QAudioOutput>
  11. #include "GEAudioOut.h"
  12. using namespace GE;
  13. //using namespace QTM_NAMESPACE;
  14. /*
  15. #ifndef Q_OS_WIN32
  16. QTM_USE_NAMESPACE
  17. #endif
  18. */
  19. const int CHANNELS = 2;
  20. const QString CODEC = "audio/pcm";
  21. const QAudioFormat::Endian BYTEORDER = QAudioFormat::LittleEndian;
  22. const QAudioFormat::SampleType SAMTYPE = QAudioFormat::SignedInt;
  23. AudioOut::AudioOut( QObject *parent, GE::IAudioSource *source ) : QThread(parent) { // qobject
  24. m_source = source;
  25. QAudioFormat format;
  26. format.setFrequency(AUDIO_FREQUENCY);
  27. format.setChannels(CHANNELS);
  28. format.setSampleSize(AUDIO_SAMPLE_BITS);
  29. format.setCodec(CODEC);
  30. format.setByteOrder(BYTEORDER);
  31. format.setSampleType(SAMTYPE);
  32. QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
  33. if (!info.isFormatSupported(format))
  34. format = info.nearestFormat(format);
  35. m_audioOutput = new QAudioOutput(info,format);
  36. #ifdef Q_WS_MAEMO_5
  37. m_audioOutput->setBufferSize(20000);
  38. m_sendBufferSize = 5000;
  39. #else
  40. m_audioOutput->setBufferSize(16000);
  41. m_sendBufferSize = 4000;
  42. #endif
  43. m_outTarget = m_audioOutput->start();
  44. m_sendBuffer = new AUDIO_SAMPLE_TYPE[ m_sendBufferSize ];
  45. m_samplesMixed = 0;
  46. m_runstate=0;
  47. #ifndef Q_OS_SYMBIAN
  48. start();
  49. #else
  50. m_audioOutput->setNotifyInterval(5);
  51. connect(m_audioOutput,SIGNAL(notify()),SLOT(audioNotify()));
  52. #endif
  53. };
  54. AudioOut::~AudioOut() {
  55. if (m_runstate==0) m_runstate = 1;
  56. if (QThread::isRunning() == false) m_runstate = 2;
  57. while (m_runstate!=2) { msleep(50); } // wait until the thread is finished
  58. m_audioOutput->stop();
  59. delete m_audioOutput;
  60. delete [] m_sendBuffer;
  61. };
  62. void AudioOut::audioNotify() {
  63. tick();
  64. };
  65. void AudioOut::tick() {
  66. // fill data to buffer as much as free space is available..
  67. int samplesToWrite = m_audioOutput->bytesFree() / (CHANNELS*AUDIO_SAMPLE_BITS/8);
  68. samplesToWrite*=2;
  69. if (samplesToWrite > m_sendBufferSize) samplesToWrite = m_sendBufferSize;
  70. if (samplesToWrite<=0) return;
  71. int mixedSamples = m_source->pullAudio( m_sendBuffer, samplesToWrite );
  72. m_outTarget->write( (char*)m_sendBuffer, mixedSamples*2 );
  73. };
  74. void AudioOut::run() {
  75. if (!m_source) { m_runstate=2; return; }
  76. int sleepTime = m_sendBufferSize * 340 / AUDIO_FREQUENCY;
  77. if (sleepTime<2) sleepTime = 2;
  78. while (m_runstate==0) {
  79. tick();
  80. msleep(sleepTime);
  81. };
  82. m_runstate = 2;
  83. };