mmsplayer v2 windows C 之(mmsplayer_wave )

25 篇文章 0 订阅
19 篇文章 0 订阅



#include "wdef.h"
#include "mmsplayer_wave.h"
#include <Windows.h>
/*
版权: Weiny Zhou
联系方式: QQ514540005
声明:未经允许不得擅自发布本代码的部分或全部。
*/
typedef struct wAudio_wave 
{
	int sample;
	int channel;
	int bits;
	int buffersize;
	LPWAVEHDR lpWaveHdr;
	unsigned char* buffer[2];
	w_wave_callback callback;
	void* pParam;
	WAVEFORMATEX sFormat;
	HWAVEOUT hWaveOut;
}wAudio_wave;
static inline void CALLBACK  w_wave_auido_Proc( HWAVEOUT hwo, UINT uMsg, DWORD dwInstance,  DWORD dwParam1, DWORD dwParam2 )
{
	WAVEHDR *wHdr;
	wAudio_wave * pAudio =NULL;
	switch (uMsg)
	{
	case WOM_OPEN:
		
		break;
	case WOM_CLOSE:
		
		break;
	case WOM_DONE:
		{
			LPWAVEHDR pWaveHeader = (LPWAVEHDR)dwParam1;
			pAudio=(wAudio_wave*)dwInstance;
			waveOutUnprepareHeader( hwo, pWaveHeader, sizeof(WAVEHDR));
			pWaveHeader->dwBufferLength = pAudio->callback(pAudio->pParam,pWaveHeader->lpData,pAudio->buffersize);
			waveOutPrepareHeader( hwo, pWaveHeader, sizeof(WAVEHDR));
			waveOutWrite( hwo, pWaveHeader, sizeof(WAVEHDR) );
		}
		break;
	default:
		break;

	}
}
wAudio w_wave_auido_open(int sample,int channel,int bits,int bytesper,int align,int bufsize,void* pParam,w_wave_callback func)
{
	wAudio_wave* pAudio=NULL;
	WAVEOUTCAPS caps;
	INTOFUNC();
	if(waveOutGetDevCaps(WAVE_MAPPER,&caps,sizeof(WAVEOUTCAPS))){
		WERROR_A("waveOutGetDevCaps error.");goto error_lab;
	}
	pAudio=WOS_MALLOC_(wAudio_wave,1);
	if(!pAudio){
		PRINTF_ERROR_VALUE(ERROR_NEWMEM);goto error_lab;
	}
	memset(pAudio,0,sizeof(wAudio_wave));
	pAudio->sFormat.wFormatTag=1;
	pAudio->sFormat.nChannels=pAudio->channel=channel;
	pAudio->sFormat.nSamplesPerSec=pAudio->sample=sample;
	pAudio->sFormat.wBitsPerSample=pAudio->bits=bits;
	pAudio->sFormat.nAvgBytesPerSec=bytesper;
	pAudio->sFormat.nBlockAlign=align;
	pAudio->buffersize=bufsize;
	pAudio->callback=func;
	pAudio->pParam=pParam;
	pAudio->sFormat.cbSize=sizeof(WAVEFORMATEX);
	pAudio->buffer[0]=WOS_MALLOC_(unsigned char,pAudio->buffersize);
	if(pAudio->channel==1)
		pAudio->lpWaveHdr=WOS_MALLOC_(WAVEHDR,1);
	else
	{
		pAudio->lpWaveHdr=WOS_MALLOC_(WAVEHDR,2);
		pAudio->buffer[1]=WOS_MALLOC_(unsigned char,pAudio->buffersize);
	}
	
	if(!pAudio||!pAudio->buffer[0]||(pAudio->channel==2&&!pAudio->buffer[1])){
		PRINTF_ERROR_VALUE(ERROR_NEWMEM);w_wave_audio_close(pAudio);goto error_lab;
	}
	
	if(waveOutOpen(&pAudio->hWaveOut,WAVE_MAPPER,&pAudio->sFormat,w_wave_auido_Proc,pAudio,CALLBACK_FUNCTION))
	{
		SAFE_FREE(pAudio);
		WERROR_A("waveOutOpen error.");goto error_lab;
	}
	memset(pAudio->lpWaveHdr,0,sizeof(WAVEHDR));
	pAudio->lpWaveHdr[0].lpData=pAudio->buffer[0];
	pAudio->lpWaveHdr[0].dwFlags=0;
	pAudio->lpWaveHdr[0].dwLoops==0;
	pAudio->lpWaveHdr[0].dwBufferLength=func(pParam,pAudio->buffer[0],bufsize);
	
	if(pAudio->channel==2){
		memset(pAudio->lpWaveHdr+1,0,sizeof(WAVEHDR));
		pAudio->lpWaveHdr[1].dwFlags=0;
		pAudio->lpWaveHdr[1].dwLoops=0;
		pAudio->lpWaveHdr[1].lpData=pAudio->buffer[1];
		pAudio->lpWaveHdr[1].dwBufferLength=func(pParam,pAudio->buffer[1],bufsize);
		waveOutPrepareHeader(pAudio->hWaveOut, pAudio->lpWaveHdr, sizeof(WAVEHDR)); 
		waveOutPrepareHeader(pAudio->hWaveOut, pAudio->lpWaveHdr+1, sizeof(WAVEHDR));

		waveOutWrite(pAudio->hWaveOut, pAudio->lpWaveHdr, sizeof(WAVEHDR)); 
		waveOutWrite(pAudio->hWaveOut, pAudio->lpWaveHdr+1, sizeof(WAVEHDR)); 
	}
	else if(pAudio->channel==1)
	{
		waveOutPrepareHeader(pAudio->hWaveOut, pAudio->lpWaveHdr, sizeof(WAVEHDR));
		waveOutWrite(pAudio->hWaveOut, pAudio->lpWaveHdr, sizeof(WAVEHDR));
	}
error_lab:
	EXITFUNC();
	return pAudio;
}
int w_wave_audio_close(wAudio audio)
{
	int nResult=0;
	wAudio_wave* pAudio=NULL;
	INTOFUNC();
	if(audio){
		nResult=ERROR_INITPARAM;PRINTF_ERROR_VALUE(nResult);goto error_lab;}
	pAudio=(wAudio_wave*)audio;
	if(pAudio->channel==0)goto error_lab;
	if(pAudio->hWaveOut)
	{
		waveOutReset(pAudio->hWaveOut);
		waveOutPrepareHeader(pAudio->hWaveOut, &pAudio->lpWaveHdr, sizeof(WAVEHDR));  

		if(pAudio->channel==2)
			waveOutPrepareHeader(pAudio->hWaveOut, &pAudio->lpWaveHdr+1, sizeof(WAVEHDR)); 
		waveOutClose(pAudio->hWaveOut);
	}
	SAFE_FREE(pAudio->lpWaveHdr);
	SAFE_FREE(pAudio->buffer[0]);
	SAFE_FREE(pAudio->buffer[1]);
error_lab:
	SAFE_FREE(pAudio);
	EXITFUNC();
	return nResult;
}



这是mmsplayer for windows 的声音接口,喜欢的拿去用。

至于ios的前面已经上传过了。

android的昨天也上传了。

版权所有,禁止转载或发布本篇文章的部分或全部。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值