要求,同一:
16位PCM音频文件中的数据读取后降低音量并另存到另一文件中。
1、后续使用fopen_s替代fopen,增强安全性,多了溢出检测,成功则返回0,失败返回非0。其调用格式为:errno_t fopen_s( FILE** pFile, const char *filename, const char *mode );其中errno_t就是int,一般使用方法如下:
int err = 0;
err =fopen_s(&input_file_ptr,"origin_audio.pcm","rb");
if (0 != err)
{
return -1;
}
如果上述读取成功,则err为0,程序继续运行,若读取不成功,err不为0,则在显示窗口显示为-1.
2、由short-float转换式中出现的是否添加括号引申出的运算符的优先级的问题
强制转换运算符>算数运算符
3、if(){return -1;},根据具体情况,如读入新的文件、导入新的指针等,确定是否添加以上语句。
4、结构体的用法:将相关的指针、变量放到一起,易查看,调用方便,后续代码优化过程中慢慢体会。
本次代码中,首次出现了"→"运算符,其类似的运算符还有“.”,箭头是指针访问成员变量的 ,点运算符是用于结构体变量访问结构体成员变量的 也就是说:如果定义的结构变量是指针 那么要访问它的成员变量用箭头 如果定义的是结构体变量的话就是用点”。
5、移位运算符:<<: 左移; >>:右移
(1)<<:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。格式是:需要移位的数字 << 移位的次数。例如: 3 << 2,则是将数字3左移2位,结果是12.在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
(2)>>:按二进制形式把所有的数字向右移动对应位移位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。例如11 >> 2,则是将数字11右移2位,结果为2.右移一位相当于除2,右移n位相当于除以2的n次方。
实现代码如下:
//该文件由Li编写,实现PCM音频文件的音量调节,调节后另存到另一文件中。
#include <stdio.h>
//short-float归一化转换时,需要用到的常数
const short MAX_VOL_S16_P = 32767;
const short MAX_VOL_S16_N = 32768;
//声明一个结构体,类型名为Pcm_data,里面存放与PCM相关的数据