【问题标题】:Printf - Controlling the output of a %.2f (float32)Printf - 控制 %.2f (float32) 的输出
【发布时间】:2016-01-10 21:29:48
【问题描述】:

我正在注销 xcode 命令行项目中音频单元渲染回调的原始数据。我从 iodata 参数中获取数据并注销这些缓冲区中的第一个“float32”字节信息,如下所示:

   Float32 someDataL = *(Float32*)(player->inputBuffer->mBuffers[0].mData);
   Float32 someDataR = *(Float32*)(player->inputBuffer->mBuffers[1].mData);

   printf("L: %.2f || R: %.2f \n", someDataL,someDataR);

这个问题是关于如何在控制台中控制这些内存缓冲区的输出。这些缓冲区的第一个 float32 字节中包含的数据是 16 位深度 pcm 音频样本,因此范围在 -32768 和 + 32768 之间。我的控制台输出不稳定,因为有时有一个“-”符号,有时没有。因此,IT 使我很难进行分析,因为日志正在左右移动。例如

L: -0.00 || R: -0.00 
L: -0.00 || R: -0.00 
L: 0.00 || R: 0.00 
L: 0.00 || R: 0.00 
L: -0.00 || R: -0.00 
L: -0.00 || R: -0.00 
L: -0.00 || R: -0.00 
L: -0.00 || R: -0.00 
L: -0.00 || R: -0.00 

有没有办法控制原木的宽度,使它们始终相等?

【问题讨论】:

  • 这个player->inputBuffer->mBuffers既丑陋又危险!
  • *(Float32*)... 是遇到麻烦的好方法。如果你有一个float 缓冲区,请将其设为float,但不要只是重新解释转换。
  • 我很欣赏建设性的批评,但 player->inputBuffer->mBuffers 有什么问题?它实际上在我正在阅读的整本书中都使用过。例如,最初分配这些缓冲区的代码是 for(UInt32 i =0; iinputBuffer->mNumberBuffers ; i++) { player->inputBuffer->mBuffers[i].mNumberChannels = 1;播放器->inputBuffer->mBuffers[i].mDataByteSize = bufferSizeBytes;播放器->inputBuffer->mBuffers[i].mData = malloc(bufferSizeBytes); }
  • 就浮动缓冲区而言,缓冲区被定义为声明它的核心音频结构中的 void* 字段。我只是将它转换为 float32 以便 C 可以取消引用该内存中的内容。默认情况下没有int,没有float。但是,音频流被格式化为包含浮点格式的 16 位样本。所以我只是想注销 pcm 的原始数据。

标签: c printf core-audio


【解决方案1】:

来自printf(3) man page

` '(空格)在有符号转换(a、A、d、e、E、f、F、g、G 或 i)产生的正数之前应留一个空格。

printf("L: % .2f || R: % .2f \n", someDataL,someDataR);

【讨论】:

  • 这样可以解决符号问题,但不能保证等宽。虽然这是一个有趣的答案。
  • 实际上这解决了它。负号是日志之间的唯一变化。现在我可以开始解释这个数字,这将是最困难的部分!
【解决方案2】:

改成

printf("L: %6.2f || R: %6.2f \n", someDataL,someDataR);
//          ^           ^
//          |___________|_____ width modifier

或任何合理的数字作为宽度修饰符。

【讨论】:

    猜你喜欢
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    相关资源
    最近更新 更多