最简单的waveout函数播放音乐

// waveOut___lab_nowindow.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <windows.h>
// C 运行时头文件
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include <conio.h>
#include <math.h>
#include<mmeapi.h>

#define BUFFER_COUNT 4


typedef struct
{
    char riff[4];
    long riffSize;
    char wave[4];
    char fmt[4];
    long fmtSize;
    INT16 FormatTag;//0x0001
    INT16 chanel;
    long one_second_hz;
    long one_second_data;
    INT16 BlockAlign;//BlockAlign数据块对齐单位(每个采样需要的字节数)     
    INT16 per_sample_bit;
    char data[4];
    long dataSize;
} WAV_HEAD;
HWAVEOUT hWaveOut;
INT16* mem = NULL;
WAVEHDR whdr;

void CALLBACK waveOutProc(HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2);

void CALLBACK waveOutProc(HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
{
    switch (uMsg) {

    case WOM_OPEN:


        break;

    case WOM_DONE:
    {        
    }

    break;

    case WOM_CLOSE:

        break;

    default:
        break;
    }
}

int main()
{
    HANDLE hFile;
    WAV_HEAD wav;
    BOOL     R;
    DWORD    num = 0, round_robin = 0;
    bool success;

    int ss = sizeof(WAV_HEAD);
    hFile = CreateFile(L"I:\\lab.wav", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    R = ReadFile(hFile, &wav, sizeof(WAV_HEAD), &num, NULL);
    if (R)
    {
        DWORD fSize = GetFileSize(hFile, &num);
        INT16* buffer = new INT16[(fSize - 44) / 2];
        round_robin = fSize - 44;
        R = ReadFile(hFile, buffer, fSize - 44, &num, NULL);
        mem = buffer;
    }
    DWORD dummy;

    // Open the sound card
    WAVEFORMATEX waveformatex;
    waveformatex.wFormatTag = WAVE_FORMAT_PCM;
    ;
    waveformatex.nChannels = wav.chanel; // Stereo
    waveformatex.nSamplesPerSec = wav.one_second_hz;
    waveformatex.nAvgBytesPerSec = wav.one_second_data; // 2 channels, 2 bytes per each sample
    waveformatex.nBlockAlign = wav.BlockAlign; // 2 channels, 2 bytes per 1 sample in each channel
    waveformatex.wBitsPerSample = wav.per_sample_bit;
    waveformatex.cbSize = 0;

    whdr.lpData = (LPSTR)mem;
    whdr.dwBufferLength = round_robin;
    whdr.dwBytesRecorded = 0;
    whdr.dwUser = 0;
    whdr.dwFlags = 0;
    whdr.dwLoops = 0;
    auto result = waveOutOpen(&hWaveOut, WAVE_MAPPER, &waveformatex, (DWORD_PTR)waveOutProc, (DWORD_PTR)&dummy, CALLBACK_FUNCTION | WAVE_FORMAT_DIRECT);
    waveOutPrepareHeader(hWaveOut, &whdr, sizeof(whdr));
    waveOutWrite(hWaveOut, &whdr, sizeof(whdr));
    if (result != MMSYSERR_NOERROR)
    {
        return false;
    }

char d;
   while(d!='q')

{

d=getchar();

}

 waveOutReset(hWaveOut);

 waveOutClose(hWaveOut);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值