【问题标题】:Decoding AudioStreamBasicDescription's mFormatFlags number (ASBD.mFormatFlags)解码 AudioStreamBasicDescription 的 mFormatFlags 编号 (ASBD.mFormatFlags)
【发布时间】:2012-09-04 18:24:45
【问题描述】:

我正在编写一个使用 CoreAudio 的音频单元 API 的 iOS 应用程序,并且在某个时间点我调用了AudioUnitGetProperty(audioUnit, kAudioUnitProperty_StreamFormat, ...)。那时我设置了一个断点来查看 ASBD,我发现mFormatFlags 字段是41。问题是,我可以从那个数字解码实际的标志名称(例如kAudioFormatFlagIsNonInterleaved | kAudioFormatFlagIsPacked | ...)吗?

非常感谢。

【问题讨论】:

    标签: ios ios-simulator core-audio audio-recording audiounit


    【解决方案1】:

    这是用于打印 ASBD 的 ostream 重载,主要取自 Apple 示例代码:

    std::ostream& operator<<(std::ostream& out, const AudioStreamBasicDescription& format)
    {
        unsigned char formatID [5];
        *(UInt32 *)formatID = OSSwapHostToBigInt32(format.mFormatID);
        formatID[4] = '\0';
    
        // General description
        out << format.mChannelsPerFrame << " ch, " << format.mSampleRate << " Hz, '" << formatID << "' (0x" << std::hex << std::setw(8) << std::setfill('0') << format.mFormatFlags << std::dec << ") ";
    
        if(kAudioFormatLinearPCM == format.mFormatID) {
            // Bit depth
            UInt32 fractionalBits = ((0x3f << 7)/*kLinearPCMFormatFlagsSampleFractionMask*/ & format.mFormatFlags) >> 7/*kLinearPCMFormatFlagsSampleFractionShift*/;
            if(0 < fractionalBits)
                out << (format.mBitsPerChannel - fractionalBits) << "." << fractionalBits;
            else
                out << format.mBitsPerChannel;
    
            out << "-bit";
    
            // Endianness
            bool isInterleaved = !(kAudioFormatFlagIsNonInterleaved & format.mFormatFlags);
            UInt32 interleavedChannelCount = (isInterleaved ? format.mChannelsPerFrame : 1);
            UInt32 sampleSize = (0 < format.mBytesPerFrame && 0 < interleavedChannelCount ? format.mBytesPerFrame / interleavedChannelCount : 0);
            if(1 < sampleSize)
                out << ((kLinearPCMFormatFlagIsBigEndian & format.mFormatFlags) ? " big-endian" : " little-endian");
    
            // Sign
            bool isInteger = !(kLinearPCMFormatFlagIsFloat & format.mFormatFlags);
            if(isInteger)
                out << ((kLinearPCMFormatFlagIsSignedInteger & format.mFormatFlags) ? " signed" : " unsigned");
    
            // Integer or floating
            out << (isInteger ? " integer" : " float");
    
            // Packedness
            if(0 < sampleSize && ((sampleSize << 3) != format.mBitsPerChannel))
                out << ((kLinearPCMFormatFlagIsPacked & format.mFormatFlags) ? ", packed in " : ", unpacked in ") << sampleSize << " bytes";
    
            // Alignment
            if((0 < sampleSize && ((sampleSize << 3) != format.mBitsPerChannel)) || (0 != (format.mBitsPerChannel & 7)))
                out << ((kLinearPCMFormatFlagIsAlignedHigh & format.mFormatFlags) ? " high-aligned" : " low-aligned");
    
            if(!isInterleaved)
                out << ", deinterleaved";
        }
        else if(kAudioFormatAppleLossless == format.mFormatID) {
            UInt32 sourceBitDepth = 0;
            switch(format.mFormatFlags) {
                case kAppleLosslessFormatFlag_16BitSourceData:      sourceBitDepth = 16;    break;
                case kAppleLosslessFormatFlag_20BitSourceData:      sourceBitDepth = 20;    break;
                case kAppleLosslessFormatFlag_24BitSourceData:      sourceBitDepth = 24;    break;
                case kAppleLosslessFormatFlag_32BitSourceData:      sourceBitDepth = 32;    break;
            }
    
            if(0 != sourceBitDepth)
                out << "from " << sourceBitDepth << "-bit source, ";
            else
                out << "from UNKNOWN source bit depth, ";
    
            out << format.mFramesPerPacket << " frames/packet";
        }
        else
            out << format.mBitsPerChannel << " bits/channel, " << format.mBytesPerPacket << " bytes/packet, " << format.mFramesPerPacket << " frames/packet, " << format.mBytesPerFrame << " bytes/frame";
    
        return out; 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 2017-10-28
      • 2016-01-23
      • 1970-01-01
      • 2021-10-31
      • 2020-03-20
      • 1970-01-01
      相关资源
      最近更新 更多