void CAComponentDescription::_CAShowComponentDescription(const AudioComponentDescription *desc, FILE* file) { if (desc) { char str[24]; fprintf (file, "AudioComponentDescription: %s - ", CAStringForOSType(desc->componentType, str, sizeof(str))); fprintf (file, "%s - ", CAStringForOSType(desc->componentSubType, str, sizeof(str))); fprintf (file, "%s", CAStringForOSType(desc->componentManufacturer, str, sizeof(str))); fprintf (file, ", 0x%X, 0x%X\n", (int)desc->componentFlags, (int)desc->componentFlagsMask); } }
char *CAStreamBasicDescription::AsString(char *buf, size_t _bufsize) const { int bufsize = (int)_bufsize; // must be signed to protect against overflow char *theBuffer = buf; int nc; char formatID[24]; CAStringForOSType (mFormatID, formatID); nc = snprintf(buf, bufsize, "%2d ch, %6.0f Hz, %s (0x%08X) ", (int)NumberChannels(), mSampleRate, formatID, (int)mFormatFlags); buf += nc; if ((bufsize -= nc) <= 0) goto exit; if (mFormatID == kAudioFormatLinearPCM) { bool isInt = !(mFormatFlags & kLinearPCMFormatFlagIsFloat); int wordSize = SampleWordSize(); const char *endian = (wordSize > 1) ? ((mFormatFlags & kLinearPCMFormatFlagIsBigEndian) ? " big-endian" : " little-endian" ) : ""; const char *sign = isInt ? ((mFormatFlags & kLinearPCMFormatFlagIsSignedInteger) ? " signed" : " unsigned") : ""; const char *floatInt = isInt ? "integer" : "float"; char packed[32]; if (wordSize > 0 && PackednessIsSignificant()) { if (mFormatFlags & kLinearPCMFormatFlagIsPacked) snprintf(packed, sizeof(packed), "packed in %d bytes", wordSize); else snprintf(packed, sizeof(packed), "unpacked in %d bytes", wordSize); } else packed[0] = '\0'; const char *align = (wordSize > 0 && AlignmentIsSignificant()) ? ((mFormatFlags & kLinearPCMFormatFlagIsAlignedHigh) ? " high-aligned" : " low-aligned") : ""; const char *deinter = (mFormatFlags & kAudioFormatFlagIsNonInterleaved) ? ", deinterleaved" : ""; const char *commaSpace = (packed[0]!='\0') || (align[0]!='\0') ? ", " : ""; char bitdepth[20]; int fracbits = (mFormatFlags & kLinearPCMFormatFlagsSampleFractionMask) >> kLinearPCMFormatFlagsSampleFractionShift; if (fracbits > 0) snprintf(bitdepth, sizeof(bitdepth), "%d.%d", (int)mBitsPerChannel - fracbits, fracbits); else snprintf(bitdepth, sizeof(bitdepth), "%d", (int)mBitsPerChannel); /* nc =*/ snprintf(buf, bufsize, "%s-bit%s%s %s%s%s%s%s", bitdepth, endian, sign, floatInt, commaSpace, packed, align, deinter); // buf += nc; if ((bufsize -= nc) <= 0) goto exit; } else if (mFormatID == 'alac') { // kAudioFormatAppleLossless
char *CAStreamBasicDescription::AsString(char *buf, size_t _bufsize, bool brief /*=false*/) const { int bufsize = (int)_bufsize; // must be signed to protect against overflow char *theBuffer = buf; int nc; char formatID[24]; CAStringForOSType(mFormatID, formatID, sizeof(formatID)); if (brief) { CommonPCMFormat com; bool interleaved; if (IdentifyCommonPCMFormat(com, &interleaved) && com != kPCMFormatOther) { const char *desc; switch (com) { case kPCMFormatInt16: desc = "Int16"; break; case kPCMFormatFixed824: desc = "Int8.24"; break; case kPCMFormatFloat32: desc = "Float32"; break; case kPCMFormatFloat64: desc = "Float64"; break; default: desc = NULL; break; } if (desc) { const char *inter =""; if (mChannelsPerFrame > 1) inter = !interleaved ? ", non-inter" : ", inter"; snprintf(buf, static_cast<size_t>(bufsize), "%2d ch, %6.0f Hz, %s%s", (int)mChannelsPerFrame, mSampleRate, desc, inter); return theBuffer; } } if (mChannelsPerFrame == 0 && mSampleRate == 0.0 && mFormatID == 0) { snprintf(buf, static_cast<size_t>(bufsize), "%2d ch, %6.0f Hz", (int)mChannelsPerFrame, mSampleRate); return theBuffer; } } nc = snprintf(buf, static_cast<size_t>(bufsize), "%2d ch, %6.0f Hz, %s (0x%08X) ", (int)NumberChannels(), mSampleRate, formatID, (int)mFormatFlags); buf += nc; if ((bufsize -= nc) <= 0) goto exit; if (mFormatID == kAudioFormatLinearPCM) { bool isInt = !(mFormatFlags & kLinearPCMFormatFlagIsFloat); int wordSize = static_cast<int>(SampleWordSize()); const char *endian = (wordSize > 1) ? ((mFormatFlags & kLinearPCMFormatFlagIsBigEndian) ? " big-endian" : " little-endian" ) : ""; const char *sign = isInt ? ((mFormatFlags & kLinearPCMFormatFlagIsSignedInteger) ? " signed" : " unsigned") : ""; const char *floatInt = isInt ? "integer" : "float"; char packed[32]; if (wordSize > 0 && PackednessIsSignificant()) { if (mFormatFlags & kLinearPCMFormatFlagIsPacked) snprintf(packed, sizeof(packed), "packed in %d bytes", wordSize); else snprintf(packed, sizeof(packed), "unpacked in %d bytes", wordSize); } else packed[0] = '\0'; const char *align = (wordSize > 0 && AlignmentIsSignificant()) ? ((mFormatFlags & kLinearPCMFormatFlagIsAlignedHigh) ? " high-aligned" : " low-aligned") : ""; const char *deinter = (mFormatFlags & kAudioFormatFlagIsNonInterleaved) ? ", deinterleaved" : ""; const char *commaSpace = (packed[0]!='\0') || (align[0]!='\0') ? ", " : ""; char bitdepth[20]; int fracbits = (mFormatFlags & kLinearPCMFormatFlagsSampleFractionMask) >> kLinearPCMFormatFlagsSampleFractionShift; if (fracbits > 0) snprintf(bitdepth, sizeof(bitdepth), "%d.%d", (int)mBitsPerChannel - fracbits, fracbits); else snprintf(bitdepth, sizeof(bitdepth), "%d", (int)mBitsPerChannel); /*nc =*/ snprintf(buf, static_cast<size_t>(bufsize), "%s-bit%s%s %s%s%s%s%s", bitdepth, endian, sign, floatInt, commaSpace, packed, align, deinter); // buf += nc; if ((bufsize -= nc) <= 0) goto exit; } else if (mFormatID == 'alac') { // kAudioFormatAppleLossless