前言
今天来对自己找到的一份网上的有关将wav文件的采样位数从16位转化成8位的程序进行解析,通过分析后加入到自己的程序中,从而完成一个自己毕设软件中的一个功能。
程序解析及源码
函数学习
首先对程序中遇到的新函数进行学习,便于后面对于程序的理解。
malloc与free函数
由于malloc函数与free函数一般都是连用的,故而放在一起进行说明。
作用:malloc函数用于向操作系统申请一片内存,free函数对应的是释放这片申请的内存,如果申请后不释放会造成内存泄漏的错误,故而free函数是必要的。
头文件: #include <stdlib.h>
函数原型:
void *malloc(size_t size);
void free(void *ptr);
参数:
malloc:size是指需要分配的字节数。
free:ptr-- 指针指向一个要释放内存的内存块,该内存块之前是通过调用 malloc、calloc 或 realloc 进行分配内存的。如果传递的参数是一个空指针,则不会执行任何动作。
返回值:
malloc:分配成功,则返回一个指向分配空间的指针。失败返回NULL指针。
free:void类型,不返回任何值。
memcpy函数
作用:C和C++使用的内存拷贝函数。从源source所指的内存地址的起始位置开始拷贝n个字节到目标destin所指的内存地址的起始位置中。
头文件: #include <string.h>
函数原型:
void *memcpy(void destin, void source, unsigned n);
参数:
destin: 指向用于存储复制内容的目标数组,类型强制转换为 void 指针。
source:指向要复制的数据源,类型强制转换为 void 指针。
n: 要被复制的字节数。
返回值:
该函数返回一个指向目标存储区destin的指针。
feof函数
作用:检测流上的文件结束符。文件结束:返回非0值,文件未结束,返回0值。
头文件: #include <stdio.h>
函数原型:
int feof(FILE *stream);
参数:
stream:FILE结构的指针
返回值:
文件结束:返回非0值,文件未结束,返回0值。
PS:feof判断文件结束是通过读取函数fread/fscanf等返回错误来识别的,故而判断文件是否结束应该是在读取函数之后进行判断。比如,在while循环读取一个文件时,如果是在读取函数之前进行判断,则如果文件最后一行是空白行,可能会造成内存错误。
源码解析
下面附上我注释过的源码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/* wav音频头部格式 */
typedef struct _wave_pcm_hdr
{
char riff[4]; // = "RIFF"
int size_8; // = FileSize - 8
char wave[4]; // = "WAVE"
char fmt[4]; // = "fmt "
int fmt_size; // = 下一个结构体的大小 : 16
short