[Qt-interest] Get audio samples from microphone

arun kumar arunkumaraymuo at gmail.com
Fri Sep 2 11:27:45 CEST 2011


Hi,


How I can take audio samples from microphone and need to change its tempo.


I tried this sample code for getting audio data but it doesnt worked to me
pls help ...





 qint64 AudioInfo::writeData(const char *data, qint64 len)

 {

          m_soundTouch.setSampleRate( m_format.sampleRate());

     m_soundTouch.setChannels(1);

     m_soundTouch.setPitchSemiTones(10);

     m_soundTouch.setSetting(2, 1);

     m_soundTouch.setSetting(0, 0);

          if (m_maxAmplitude) {

         Q_ASSERT(m_format.sampleSize() % 8 == 0);

         const int channelBytes = m_format.sampleSize() / 8;

         const int sampleBytes = m_format.channels() * channelBytes;

         Q_ASSERT(len % sampleBytes == 0);

         const int numSamples = len / sampleBytes;

          quint16 maxValue = 0;

         const unsigned char *ptr = reinterpret_cast<const unsigned
char *>(data);

          for (int i = 0; i < numSamples; ++i) {

             for(int j = 0; j < m_format.channels(); ++j) {

                 quint16 value = 0;

                  if (m_format.sampleSize() == 8 &&
m_format.sampleType() == QAudioFormat::UnSignedInt) {

                     value = *reinterpret_cast<const quint8*>(ptr);

                 } else if (m_format.sampleSize() == 8 &&
m_format.sampleType() == QAudioFormat::SignedInt) {

                     value = qAbs(*reinterpret_cast<const qint8*>(ptr));

                 } else if (m_format.sampleSize() == 16 &&
m_format.sampleType() == QAudioFormat::UnSignedInt) {

                     if (m_format.byteOrder() == QAudioFormat::LittleEndian)

                         value = qFromLittleEndian<quint16>(ptr);

                     else

                         value = qFromBigEndian<quint16>(ptr);

                 } else if (m_format.sampleSize() == 16 &&
m_format.sampleType() == QAudioFormat::SignedInt) {

                     if (m_format.byteOrder() == QAudioFormat::LittleEndian)

                         value = qAbs(qFromLittleEndian<qint16>(ptr));

                     else

                         value = qAbs(qFromBigEndian<qint16>(ptr));

                 }

                  //sleep(1);

                  m_soundTouch.putSamples((soundtouch::SAMPLETYPE*)value, len);

                  maxValue= m_soundTouch.receiveSamples(len);

                  maxValue = qMax(value, maxValue);

                 ptr += channelBytes;

             }

         }

          maxValue = qMin(maxValue, m_maxAmplitude);

         m_level = qreal(maxValue) / m_maxAmplitude;

     }

      emit update();

     return len;

 }







My SoundTouch library uses float samples for audio processing




Thanks,

Arun Kumar KS
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.qt-project.org/pipermail/qt-interest-old/attachments/20110902/0d8a0dca/attachment-0001.html 


More information about the Qt-interest-old mailing list