wav头文件的定义和接口(2)

#include <stdio.h>
#include <stdlib.h>

#include "cdefs.h"
#include "wav_out.h"


static WAV_HEAD hdr =
{
    FileChunkID:    "RIFF",
    RIFFType:        "WAVE",
    FmtChunkID:        "fmt ",
    dwFmtChunkLen:    16,
    wCompression:    WAVE_COMPRESSION_PCM,
    DataChunkID:    "data",
};

ssize_t WaveInitHeader(FILE* fp, int sample_rate, int bits_per_sample, int channels)
{
    hdr.wChannels = channels;
    hdr.dwSamplesPerSec = sample_rate;
    hdr.dwAvgBytesPerSec = sample_rate * (bits_per_sample / 8 * channels);
    hdr.wBlockAlign = bits_per_sample / 8 * channels;
    hdr.wBitsPerSample = bits_per_sample;
    hdr.dwFileChunkLen = sizeof(WAV_HEAD) - 8;
    hdr.dwDataLen = 0;

    return fwrite(&hdr, sizeof(hdr), 1, fp) == 1 ? sizeof(hdr) : 0;
}

ssize_t WaveWriteData(FILE* fp, void* buff, size_t size)
{
    fseek(fp, 0, SEEK_END);
      if (fwrite(buff, 1, size, fp) != size)
      {
          fprintf(stderr,"fwrite failed !/n");
          return -1;
      }

    hdr.dwFileChunkLen += size;
    hdr.dwDataLen += size;
    fseek(fp, 0, SEEK_SET);
    fwrite(&hdr, sizeof(hdr), 1, fp);

    return size;
}

int WaveSync(FILE* fp)
{
    if (hdr.dwDataLen & 1)
    {
        fseek(fp, 0, SEEK_END);
        fputc(0, fp);

        hdr.dwFileChunkLen++;
        hdr.dwDataLen++;
        fseek(fp, 0, SEEK_SET);
        fwrite(&hdr, sizeof(hdr), 1, fp);
    }

    fflush(fp);

    return 0;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值