📄 wavplay.cpp
字号:
//
// Copyright(C) Renesas Technology Corp. 2003-2005. All rights reserved.
//
// Test program for wavedev for ITS-DS7
//
// FILE : wavplay.cpp
// CREATED : 2003.06.20
// MODIFIED : 2005.03.04
// AUTHOR : Renesas Technology Corp.
// HARDWARE : RENESAS ITS-DS7
// NOTES : Device ID can be specified.
// HISTORY :
// 2003.06.20
// - Created release code.
// 2005.03.04
// - Modified use a blank for a file name.
// - Modified display the number of device in case of usage indication.
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
#include <windows.h>
#include <dsound.h>
#include "wavefile.h"
#define NELEMS(a) (sizeof(a)/sizeof((a)[0]))
#define MRCHECK(r,str,label)\
if ((r != MMSYSERR_NOERROR)) { RETAILMSG(1, (TEXT(#str) TEXT(" failed. mr=%08x\r\n"), r)); mr = r; goto label;}
MMRESULT
PlayFile(LPCTSTR pszFilename, DWORD dwDeviceId)
{ MMRESULT mr;
DWORD dwBufferSize;
PBYTE pBufferBits = NULL;
PWAVEFORMATEX pwfx = NULL;
DWORD dwSlop;
DWORD dwWait;
DWORD dwDuration;
HANDLE hevDone = CreateEvent(NULL, FALSE, FALSE, NULL);
if (hevDone == NULL) {
return MMSYSERR_NOMEM;
}
mr = ReadWaveFile(pszFilename,&pwfx,&dwBufferSize,&pBufferBits);
MRCHECK(mr, ReadWaveFile, ERROR_READ);
dwDuration = dwBufferSize * 1000 / pwfx->nAvgBytesPerSec;
RETAILMSG(1, (TEXT("\"%s\" %c%02d %5dHz %6d bytes %5d ms\r\n")
, pszFilename
, pwfx->nChannels == 2 ? L'S' : L'M'
, pwfx->wBitsPerSample
, pwfx->nSamplesPerSec
, dwBufferSize
, dwDuration
));
HWAVEOUT hwo;
mr = waveOutOpen(&hwo, dwDeviceId, pwfx, (DWORD) hevDone, NULL, CALLBACK_EVENT);
MRCHECK(mr, waveOutOpen, ERROR_OPEN);
WAVEHDR hdr;
memset(&hdr, 0, sizeof(hdr));
hdr.dwBufferLength = dwBufferSize;
hdr.lpData = (char *) pBufferBits;
mr = waveOutPrepareHeader(hwo, &hdr, sizeof(hdr));
MRCHECK(mr, waveOutPrepareHeader, ERROR_PLAY);
mr = waveOutWrite(hwo, &hdr, sizeof(hdr));
MRCHECK(mr, waveOutWrite, ERROR_PLAY);
// wait for play + 1 second slop
dwSlop = 1000;
dwWait = WaitForSingleObject(hevDone, dwDuration + dwSlop);
if (dwWait != WAIT_OBJECT_0) {
// not much to here, other than issue a warning
RETAILMSG(1, (TEXT("Timeout waiting for playback to complete\r\n")));
}
mr = waveOutUnprepareHeader(hwo, &hdr, sizeof(hdr));
MRCHECK(mr, waveOutUnprepareHeader, ERROR_PLAY);
ERROR_PLAY:
mr = waveOutClose(hwo);
MRCHECK(mr, waveOutClose, ERROR_OPEN);
ERROR_OPEN:
delete [] pBufferBits;
delete [] pwfx;
ERROR_READ:
CloseHandle(hevDone);
return mr;
}
PTSTR usage_text[] =
{
TEXT("usage:\r\n"),
TEXT(" -f <filename> input filename\r\n"),
TEXT(" -d <device_id> device_id(0,1,...)\r\n"),
TEXT(" -? help\r\n"),
};
void
Usage(void)
{ int i;
for (i = 0; i < NELEMS(usage_text); i++) {
RETAILMSG(1, (usage_text[i]));
}
}
int
WINAPI WinMain
( HINSTANCE hInstance
, HINSTANCE hPrevInstance
, LPTSTR lpCmdLine
, int nCmdShow
)
{
PTSTR pOption;
TCHAR ws[] = TEXT(" \t");
int errors = 0;
DWORD dwDeviceId = 0; // capture from device 0
PTSTR pszFilename = TEXT("windows\\exclam.wav");
UINT numdev;
UINT cmdlen;
PTSTR pNext;
RETAILMSG(1, (TEXT("+wavplay2\r\n")));
/*
if (lpCmdLine == NULL || *lpCmdLine == 0) {
lpCmdLine = TEXT("windows\\exclam.wav");
}
PlayFile(lpCmdLine);
*/
cmdlen = _tcslen(lpCmdLine);
// parse the command line
for (pOption = _tcstok(lpCmdLine, ws); pOption != NULL; pOption = _tcstok(NULL, ws)) {
if (pOption[0] != '/' && pOption[0] != '-') {
RETAILMSG(1, (TEXT("Unrecognized argument %s\r\n"), pOption));
errors++;
continue;
}
PTSTR pParameter = _tcstok(NULL, ws);
if (pParameter == NULL) {
RETAILMSG(1, (TEXT("Missing parameter to option %s\r\n"), pOption));
}
switch (pOption[1]) {
case 'f':
pszFilename = pParameter;
for(pNext=&pParameter[_tcslen(pParameter)+1];*pNext==' ' || *pNext=='\t';pNext++) ;
// case:space in filename
// "\CD-ROM Drive\xxx.wav"
while(cmdlen > (UINT)(pParameter-lpCmdLine+_tcslen(pParameter)) && *pNext != '-'){
//skip(also filename)
pParameter[_tcslen(pParameter)] = ' ';
pParameter = _tcstok(NULL, ws);
for(pNext=&pParameter[_tcslen(pParameter)+1];*pNext==' ' || *pNext=='\t';pNext++) ;
}
break;
case 'd':
dwDeviceId = _ttoi(pParameter);
// numdev = waveInGetNumDevs();
// RETAILMSG(1, (TEXT("Number Of Input DeviceID %d\r\n"),numdev));
numdev = waveOutGetNumDevs();
// RETAILMSG(1, (TEXT("Number Of Output DeviceID %d\r\n"),numdev));
if(numdev == 0 || numdev <= dwDeviceId){
RETAILMSG(1, (TEXT("Not found DeviceID %d(Device Num %d)\r\n"),dwDeviceId ,numdev));
errors++;
}
break;
case '?':
case 'h':
Usage();
RETAILMSG(1, (TEXT("Number Of Audio Device\r\n")));
numdev = waveInGetNumDevs();
RETAILMSG(1, (TEXT(" Input DeviceID :%d\r\n"),numdev));
numdev = waveOutGetNumDevs();
RETAILMSG(1, (TEXT(" Output DeviceID:%d\r\n"),numdev));
numdev = mixerGetNumDevs();
RETAILMSG(1, (TEXT(" Mixer DeviceID :%d\r\n"),numdev));
errors++;
break;
default:
RETAILMSG(1, (TEXT("Unrecognized option %s\r\n"), pOption));
errors++;
break;
}
}
if (errors > 0) {
// we've already issued complaint, now just exit
return -1;
}
PlayFile(pszFilename, dwDeviceId);
RETAILMSG(1, (TEXT("-wavplay2\r\n")));
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -