大家好,最近在研究QT examples录音
部分源代码audioinput,以下这个函数看不懂,只知道是往QIODevice写
数据,
但是什么原理为什么这么做一点都不明白,望哪位大侠能指点指点,谢谢!
qint64 AudioInfo::writeData(const char *data,
qint64 len)
{
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));
}
maxValue =
qMax(value, maxValue);//???
ptr += channelBytes;
}
}
maxValue =
qMin(maxValue, m_maxAmplitude);
m_level = qreal(maxValue) / m_maxAmplitude;
}
emit
update();
return len;
}
实例完整部分
代码:http://doc.qt.nokia.com/stable/multimedia-audioinput-audioinput-cpp.html