diff options
Diffstat (limited to 'src/multimedia/platform/darwin/audio/qcoreaudioutils.mm')
-rw-r--r-- | src/multimedia/platform/darwin/audio/qcoreaudioutils.mm | 59 |
1 files changed, 41 insertions, 18 deletions
diff --git a/src/multimedia/platform/darwin/audio/qcoreaudioutils.mm b/src/multimedia/platform/darwin/audio/qcoreaudioutils.mm index 065bff707..6b0721b60 100644 --- a/src/multimedia/platform/darwin/audio/qcoreaudioutils.mm +++ b/src/multimedia/platform/darwin/audio/qcoreaudioutils.mm @@ -71,17 +71,36 @@ double CoreAudioUtils::frequency() QAudioFormat CoreAudioUtils::toQAudioFormat(AudioStreamBasicDescription const& sf) { QAudioFormat audioFormat; + // all Darwin HW is little endian, we ignore those formats + if ((sf.mFormatFlags & kAudioFormatFlagIsBigEndian) != 0 && QSysInfo::ByteOrder != QSysInfo::LittleEndian) + return audioFormat; + + // filter out the formats we're interested in + QAudioFormat::SampleFormat format = QAudioFormat::Unknown; + switch (sf.mBitsPerChannel) { + case 8: + if ((sf.mFormatFlags & kAudioFormatFlagIsSignedInteger) == 0) + format = QAudioFormat::UInt8; + break; + case 16: + if ((sf.mFormatFlags & kAudioFormatFlagIsSignedInteger) != 0) + format = QAudioFormat::Int16; + break; + case 32: + if ((sf.mFormatFlags & kAudioFormatFlagIsSignedInteger) != 0) + format = QAudioFormat::Int32; + else if ((sf.mFormatFlags & kAudioFormatFlagIsFloat) != 0) + format = QAudioFormat::Float; + break; + default: + break; + } + + if (format == QAudioFormat::Unknown) + return audioFormat; audioFormat.setSampleRate(sf.mSampleRate); audioFormat.setChannelCount(sf.mChannelsPerFrame); - audioFormat.setSampleSize(sf.mBitsPerChannel); - audioFormat.setByteOrder((sf.mFormatFlags & kAudioFormatFlagIsBigEndian) != 0 ? QAudioFormat::BigEndian : QAudioFormat::LittleEndian); - QAudioFormat::SampleType type = QAudioFormat::UnSignedInt; - if ((sf.mFormatFlags & kAudioFormatFlagIsSignedInteger) != 0) - type = QAudioFormat::SignedInt; - else if ((sf.mFormatFlags & kAudioFormatFlagIsFloat) != 0) - type = QAudioFormat::Float; - audioFormat.setSampleType(type); return audioFormat; } @@ -94,21 +113,25 @@ AudioStreamBasicDescription CoreAudioUtils::toAudioStreamBasicDescription(QAudio sf.mSampleRate = audioFormat.sampleRate(); sf.mFramesPerPacket = 1; sf.mChannelsPerFrame = audioFormat.channelCount(); - sf.mBitsPerChannel = audioFormat.sampleSize(); - sf.mBytesPerFrame = sf.mChannelsPerFrame * (sf.mBitsPerChannel / 8); + sf.mBitsPerChannel = audioFormat.bytesPerSample() * 8; + sf.mBytesPerFrame = audioFormat.bytesPerFrame(); sf.mBytesPerPacket = sf.mFramesPerPacket * sf.mBytesPerFrame; sf.mFormatID = kAudioFormatLinearPCM; - switch (audioFormat.sampleType()) { - case QAudioFormat::SignedInt: sf.mFormatFlags |= kAudioFormatFlagIsSignedInteger; break; - case QAudioFormat::UnSignedInt: /* default */ break; - case QAudioFormat::Float: sf.mFormatFlags |= kAudioFormatFlagIsFloat; break; - case QAudioFormat::Unknown: default: break; + switch (audioFormat.sampleFormat()) { + case QAudioFormat::Int16: + case QAudioFormat::Int32: + sf.mFormatFlags |= kAudioFormatFlagIsSignedInteger; + break; + case QAudioFormat::Float: + sf.mFormatFlags |= kAudioFormatFlagIsFloat; + break; + case QAudioFormat::UInt8: + /* default */ + case QAudioFormat::Unknown: + break; } - if (audioFormat.byteOrder() == QAudioFormat::BigEndian) - sf.mFormatFlags |= kAudioFormatFlagIsBigEndian; - return sf; } |