代码之家  ›  专栏  ›  技术社区  ›  Morrowless

CAFAudioDescription成员类型和端序

  •  0
  • Morrowless  · 技术社区  · 12 年前

    CAFAudioDescription mSampleRate 成员是 Float64 类型,但要给它赋值,比如44100.0,我需要先将它转换为big-endian。功能 CFConvertFloat64HostToSwapped 返回a CFSwappedFloat64 哪个是 uint64_t 浮动64 .

    为什么它返回一个int类型?我甚至不能把它当作 浮动64 .

        // required file header
        CAFFileHeader fileHeader;
        fileHeader.mFileType = CFSwapInt32HostToBig('caff');
        fileHeader.mFileVersion = CFSwapInt16HostToBig(1);
        fileHeader.mFileFlags = CFSwapInt16HostToBig(0);
    
        // required chunk header for audio description chunk below
        CAFChunkHeader audioHeader;
        audioHeader.mChunkType = CFSwapInt32HostToBig('desc');
        audioHeader.mChunkSize = sizeof(CAFAudioDescription);
    
        // required first chunk
        CAFAudioDescription audioChunk;
        audioChunk.mSampleRate = CFConvertFloat64HostToSwapped(44100.0); // type mismatch
    
    2 回复  |  直到 12 年前
        1
  •  1
  •   user694733    12 年前

    当您更改endianness时,该值对主机系统不再有意义。它只是一堆碎片。

    没有理由不能将这些位存储到任何可以容纳64位的类型,甚至 Float64 .

    然而,端序交换通常是通过位移位和掩码来完成的,并且由于无符号整数类型最适合该作业(不能使用浮点来完成),因此位模式可能被分配给 uint64_t 手术前。

    您可以在操作后将位移回float类型,但这将是额外的步骤,而且值无论如何都没有意义。

    有符号整数转换不必首先转换为无符号整数,因为位运算可以使用它们。不过,这样做有利于API的一致性,因为交换的有符号整数上的数值也没有意义。

        2
  •  1
  •   Thomas Padron-McCarthy    12 年前

    我只是Objective-C的初学者,还没有使用过这个API,但是:

    uint64_t就是这样,它是一个64位的东西。然而,存储在这64位中的不是整数,而是转换后的Float64。它没有Float64类型,因为它 不是 Float64,但 转换 浮动64。