底层设备接口函数回放声音

#include <windows.h>

#include <fstream>
#include <iostream>
using namespace std;

#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")

static int GetFileLen(char* name);

//功能:播放wav音频文件
int PlayWave(char* filename, WAVEFORMATEX fmt)
{
    DWORD wavesize = GetFileLen(filename);
    if ( -1 == wavesize )
    {
        return -1;
    }

    FILE* fp = fopen(filename, "rb");
    if ( NULL == fp )
    {
        return -1;
    }

    char* lpwavedata = NULL;
    lpwavedata = new char[wavesize];

    fread(lpwavedata, 1, wavesize, fp);
    fclose(fp);

    HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

    MMRESULT hr = MMSYSERR_NOERROR;

    HWAVEOUT hWave;
    hr = waveOutOpen(&hWave, WAVE_MAPPER, (LPWAVEFORMATEX)&fmt, (DWORD)hEvent, 0, CALLBACK_EVENT);
    if ( MMSYSERR_NOERROR != hr )
    {
        printf("waveOutOpen error:[%d]\n", hr);
        getchar();
        return -1;
    }

    WAVEHDR whdr;
    memset(&whdr, 0, sizeof(WAVEHDR));
    whdr.lpData = lpwavedata;
    whdr.dwBufferLength = wavesize;

    hr = waveOutPrepareHeader(hWave, &whdr, sizeof(WAVEHDR));
    if ( MMSYSERR_NOERROR != hr )
    {
        printf("waveOutPrepareHeader error:[%d]\n", hr);
        getchar();
        return -1;
    }

    //设置输出音量
    hr = waveOutSetVolume(hWave, 0xFFFF); // 0xFFFF为最大有效值
    if ( MMSYSERR_NOERROR != hr )
    {
        printf("waveOutSetVolume error:[%d]\n", hr);
        getchar();
        return -1;
    }

    //输出音频
    hr = waveOutWrite(hWave, &whdr, sizeof(WAVEHDR));
    if ( MMSYSERR_NOERROR != hr )
    {
        printf("waveOutWrite error:[%d]\n", hr);
        getchar();
        return -1;
    }
    printf("正在播放音乐...\n");

    //等待播放完成
    ResetEvent(hEvent);
    WaitForSingleObject(hEvent, INFINITE);

    printf("播放结束\n");

    //收尾工作
    waveOutUnprepareHeader(hWave, &whdr, sizeof(WAVEHDR));
    waveOutClose(hWave);
    CloseHandle(hEvent);

    delete[] lpwavedata;
    lpwavedata = NULL;

    return 0;
}

//功能:获取文件长度(单位:字节)
static int GetFileLen(char* name)
{
    int beg_pos = 0;
    int end_pos = 0;

    ifstream file(name);
    if ( !file.is_open() )
    {
        return -1;
    }

    beg_pos = file.tellg();
    file.seekg(0, ios::end);
    end_pos = file.tellg();

    file.close();

    return (end_pos - beg_pos);
}

//主函数
int main(void)
{
    char szWavFile[] = ".\\demo.wav";

    //todo:从wav文件中提取以下信息
    WAVEFORMATEX fmt;
    fmt.wFormatTag = WAVE_FORMAT_PCM;
    fmt.nChannels = 2;
    fmt.nSamplesPerSec = 44100;
    fmt.nAvgBytesPerSec = 176400;
    fmt.nBlockAlign = 4;
    fmt.wBitsPerSample = 16;
    fmt.cbSize = 0;

    PlayWave(szWavFile, fmt);

    return 0;
}


附上wav文件格式:

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值