⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hspdifin.cpp

📁 WinCE5.0BSP for Renesas SH7770
💻 CPP
字号:
//
//  Copyright(C) Renesas Technology Corp. 2002-2003. All rights reserved.
//
//  sample program for HSpdifRx for ITS-DS7
//
//  FILE     : HSpdifin.c
//  CREATED  : 2002.06.26
//  MODIFIED : 2003.12.25
//  AUTHOR   : Renesas Technology Corp.
//  HARDWARE : RENESAS ITS-DS7
//  HISTORY  : 
//             2003.06.20
//             - Created release code.
//                (based on sample program for HSpdifRx for ITS-DS4 Ver.1.0.0)
//             2003.12.25
//             - Supported .wav file.
//             - Added parameter.
//             - Supported recording time.
//

#include <windows.h>
#include "ioctl_its_ds7.h"
#include "wavefile.h"

#define BUFF_SIZE	0x8000
#define TIMEOUT_MAX	5

#define NELEMS(a) (sizeof(a)/sizeof((a)[0]))
#define MRCHECK(mr,str)\
    if ((mr != MMSYSERR_NOERROR)) { RETAILMSG(1, (TEXT(#str) TEXT(" failed. mr=%08x\r\n"), mr)); goto ERROR_RET;}

typedef struct {
  unsigned char FName[16];
  unsigned long Dmy1[2];
  unsigned long SamplingRate1;
  unsigned long SamplingRate2;
  unsigned short Dmy2;
  unsigned short BitsPerSample;
  unsigned long Dmy3;
  unsigned long Length;
} HEADER;

PBYTE Data;

PTSTR usage_text[] =
{
    TEXT("usage:\r\n"),
    TEXT("       -f <filename>    outpout filename(.wav file or PCM raw data file)\r\n"),
    TEXT("       -b <bitsize>     sample bit size(16/20/24)\r\n"),
    TEXT("       -t <duration>	  recording time in milliseconds\r\n"),
    TEXT("       -m <mode>		  output file mode(0:pcm/1:wav)\r\n"),
    TEXT("       -?               help\r\n"),
    TEXT("note:\r\n"),
    TEXT("       HSPDIF supported only 44.1kHz stereo.\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,
    LPWSTR lpCmdLine,
	int nCmdShow)
{
HANDLE	hDevice=NULL;
HANDLE  hDriver;
DWORD	dwRet;
DWORD	dwData;
HANDLE	hFile=NULL;
//HEADER	Head;
DWORD	nCnt;
//DWORD	TickCnt, TransNum;
DWORD NoDataNum;
BOOL	RetCode;

PTSTR pOption;
TCHAR ws[] = TEXT(" \t");
int errors = 0;
PTSTR pszFilename = TEXT("spdifout.pcm");
DWORD	dwBitSize=16;
DWORD dwDuration = 5 * 1000;    // record for 5 seconds
DWORD dwMode = 0;
DWORD	dwRemain;
DWORD	dwBytesRecorded;
MMRESULT mr;

PBYTE pBufferBits=NULL;
DWORD dwBufferSize;
WAVEFORMATEX wfx;

	RETAILMSG(1, (TEXT("SPDIF recording start.\r\n")));

    // 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;
            break;

        case 'b':
            dwBitSize = _ttoi(pParameter);
			switch(dwBitSize){
			case 16:
			case 20:
			case 24:
				break;
			default:
	            RETAILMSG(1, (TEXT("Illegal sample bit size %d\r\n"),dwBitSize));
	            errors++;
				break;
			}
            break;

        case 't':
            dwDuration = _ttoi(pParameter);
            break;

        case 'm':
            dwMode = _ttoi(pParameter);
			if(dwMode < 0 || 1 < dwMode){
	            RETAILMSG(1, (TEXT("Illegal output file mode %d\r\n"),dwMode));
	            errors++;
				break;
			}
            break;

        case '?':
        case 'h':
            Usage();
            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;
    }

    // set up the wave format structure
    wfx.cbSize = 0;
    wfx.wFormatTag = WAVE_FORMAT_PCM;
    wfx.wBitsPerSample = (WORD) dwBitSize;
    wfx.nSamplesPerSec = 44100;
    wfx.nChannels = (WORD) 2;
    wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
    wfx.nAvgBytesPerSec = wfx.nBlockAlign * wfx.nSamplesPerSec;

    // compute the size of the capture buffer
    // compute total # of samples & multiply by blocksize to get sample-aligned buffer size
    dwBufferSize = (dwDuration * wfx.nSamplesPerSec / 1000) * wfx.nBlockAlign;

    // let user know what's going on
    RETAILMSG(1, (TEXT("Recording %5d ms to \"%s\": S%02d 44100Hz (%8d bytes)\r\n")
        , dwDuration
        , pszFilename
        , dwBitSize
        , dwBufferSize
        ));

	if(dwMode==0){
		// pcm
		hFile = CreateFile(pszFilename, GENERIC_WRITE, FILE_SHARE_WRITE,
						NULL, CREATE_ALWAYS, 0, NULL);
		if ( hFile == INVALID_HANDLE_VALUE ){
			RETAILMSG(1, (TEXT("File open failed. rc %d\r\n"), GetLastError()));
			return 0;
		}

	    pBufferBits = new BYTE[BUFF_SIZE];
	    if (pBufferBits == NULL) {
	        RETAILMSG(1, (TEXT("Unable to allocate chunk buffer\r\n")));
			CloseHandle(hFile);
	        goto ERROR_RET;
	    }
	}
	else{
		// wav
	    
	    // try to allocate the capture buffer
	    pBufferBits = new BYTE [dwBufferSize];
	    if (pBufferBits == NULL) {
	        RETAILMSG (1, (TEXT("Unable to allocate %d bytes for %d ms of audio data\r\n"), dwBufferSize, dwDuration));
	        goto ERROR_RET;
	    }

	}
//	WriteFile(hFile, &Head, sizeof(HEADER), &nCnt, NULL);

//	DEBUGMSG(1, (TEXT("Sampling rate : %dHz BitsPerSample : %d\r\n"),
//			Head.SamplingRate1, Head.BitsPerSample));

	hDevice = CreateFile(
			TEXT("SPD1:"),
			GENERIC_READ,
			0,
			NULL,
			OPEN_EXISTING,
			FILE_ATTRIBUTE_NORMAL,
			NULL);
	if ( hDevice == INVALID_HANDLE_VALUE ){
		if ( GetLastError() == ERROR_DEV_NOT_EXIST ){
			//register spdif driver 
			hDriver = RegisterDevice(TEXT("SPD"), 1, TEXT("HSPDIF.DLL"), 0);
			if ( !hDriver ){
				RETAILMSG(1, (TEXT("Failed to register spdif device driver.\r\n")));
			}
			hDevice = CreateFile(TEXT("SPD1:"),
					GENERIC_READ,
					0, NULL, OPEN_EXISTING,
					FILE_ATTRIBUTE_NORMAL, NULL);
		}
		if ( hDevice == INVALID_HANDLE_VALUE ){
			RETAILMSG(1, (TEXT("Failed to open spdif device driver.\r\n")));
			CloseHandle(hFile);
			return 0;
		}
	}

	switch(dwBitSize){
	case 16:	dwData = SPDIF_SAMPLE_BIT_SIZE_16;	break;
	case 20:	dwData = SPDIF_SAMPLE_BIT_SIZE_20;	break;
	case 24:	dwData = SPDIF_SAMPLE_BIT_SIZE_24;	break;
	default:	break;
	}

	switch( dwData ){
		case SPDIF_SAMPLE_BIT_SIZE_16:
			RETAILMSG(1, (TEXT("Set SampleSize : 16\r\n")));
			break;

		case SPDIF_SAMPLE_BIT_SIZE_20:
			RETAILMSG(1, (TEXT("Set SampleSize : 20\r\n")));
			break;

		case SPDIF_SAMPLE_BIT_SIZE_24:
			RETAILMSG(1, (TEXT("Set SampleSize : 24\r\n")));
			break;

		default : 
			break;
	}

	RetCode = DeviceIoControl(hDevice, IOCTL_SPDIF_SET_RXSAMPLE_SIZE,
		&dwData, sizeof(DWORD), NULL, 0, &dwRet, NULL);
	if (RetCode == FALSE) {
		RETAILMSG(1, (TEXT("Error : IOCTL_SPDIF_SET_RXSAMPLE_SIZE\r\n")));
		CloseHandle( hFile );
		CloseHandle( hDevice );
		return 0;
	}

	RetCode = DeviceIoControl(hDevice, IOCTL_SPDIF_GET_RXSAMPLE_SIZE,
		NULL, 0, &dwData, sizeof(DWORD), &dwRet, NULL);
	if (RetCode == FALSE) {
		RETAILMSG(1, (TEXT("Error : IOCTL_SPDIF_GET_RXSAMPLE_SIZE\r\n")));
		CloseHandle( hFile );
		CloseHandle( hDevice );
		return 0;
	}

	switch( dwData ){
		case SPDIF_SAMPLE_BIT_SIZE_16: dwData = 16;break;
		case SPDIF_SAMPLE_BIT_SIZE_20: dwData = 20;break;
		case SPDIF_SAMPLE_BIT_SIZE_24: dwData = 24;break;
		default : dwData = 0;break;
	}
	RETAILMSG(1, (TEXT("Get SampleSize : %d\r\n"), dwData));

//	TickCnt = GetTickCount();
//	TransNum = 0;
	NoDataNum = 0;
	Data = pBufferBits;
	dwRemain = dwBufferSize;
	dwBytesRecorded=0;

	while(1){
		if(hFile){
			Data = pBufferBits;
		}
		nCnt = BUFF_SIZE;
		if(dwRemain < BUFF_SIZE){
			nCnt = dwRemain;
		}

		dwRet= 0;
		RetCode = DeviceIoControl(hDevice, IOCTL_SPDIF_RECEIVING_DATA,
			NULL, 0, Data, nCnt, &dwRet, NULL);
		if (RetCode == FALSE) {
			if (GetLastError() == ERROR_INVALID_PARAMETER) {
				RETAILMSG(1, (TEXT("Error : IOCTL_SPDIF_RECEIVING_DATA - Invalid Params.\r\n")));
				break;
			} else if (GetLastError() == ERROR_TIMEOUT) {
				RETAILMSG(1, (TEXT("Error : IOCTL_SPDIF_RECEIVING_DATA - TimeOut.\r\n")));
			}
		}
		if ( dwRet == 0 ){
			NoDataNum ++;
			if ( NoDataNum > TIMEOUT_MAX ){
				RETAILMSG(1, (TEXT("TimeOut. Stop recording.\r\n")));
				break;
			}
			continue;
		}
		
		dwBytesRecorded+=dwRet;
		if(hFile){
//			dwRet = BUFF_SIZE;
			WriteFile(hFile, Data, dwRet, &nCnt, NULL);
//			TransNum ++;
		}
		if(dwRemain<=dwRet){
			break;
		}
		dwRemain-=dwRet;
		if(!hFile){
			Data+=dwRet;
		}
		

//		DEBUGMSG(1, (TEXT("Spdif in %d  %d bytes received.\r\n"), TransNum, dwRet));
//		if ( nCnt != BUFF_SIZE )
//			break;

//		if ( TransNum == 100 )
//			break;
	}
	DeviceIoControl(hDevice, IOCTL_SPDIF_STOP_RECEIVE,
		NULL, 0, NULL, 0, &dwRet, NULL);
//	RETAILMSG(1, (TEXT("Number of received : %d Time(ms) : %d\r\n"),
//			TransNum, GetTickCount() - TickCnt));

    RETAILMSG(1, (TEXT("Capture completed. Writing %s\r\n"), pszFilename));
	if(!hFile){
	    // finally, write the captured buffer to the file
	    // note that we use hdr.dwBytesRecorded, not dwBuffersize.
	    mr = WriteWaveFile(pszFilename, &wfx, dwBytesRecorded, pBufferBits);
	    MRCHECK(mr, WriteWaveFile);
	}

	RETAILMSG(1, (TEXT("SPDIF recording finished. %s\r\n"),pszFilename));

ERROR_RET:
    if(pBufferBits) delete [] pBufferBits;
	if(hFile) CloseHandle( hFile );
	if(hDevice) CloseHandle( hDevice );
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -