pcsx2/plugins/PeopsSPU2/record.c

185 lines
5.9 KiB
C

/***************************************************************************
spu.c - description
-------------------
begin : Sun Jan 12 2003
copyright : (C) 2003 by Pete Bernert
email : BlackDove@addcom.de
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. See also the license.txt file for *
* additional informations. *
* *
***************************************************************************/
//*************************************************************************//
// History of changes:
//
// 2005/08/29 - Pete
// - changed to 48Khz output
//
// 2003/03/01 - Pete
// - added mono mode
//
// 2003/01/12 - Pete
// - added recording funcs (win version only)
//
//*************************************************************************//
#include "stdafx.h"
#ifdef _WINDOWS
#include <mmsystem.h>
#include "resource.h"
#include "externals.h"
#define _IN_RECORD
#include "record.h"
////////////////////////////////////////////////////////////////////////
int iDoRecord=0;
HMMIO hWaveFile=NULL;
MMCKINFO mmckMain;
MMCKINFO mmckData;
char szFileName[256]={"C:\\PEOPS.WAV"};
////////////////////////////////////////////////////////////////////////
void RecordStart()
{
WAVEFORMATEX pcmwf;
// setup header in the same format as our directsound stream
memset(&pcmwf,0,sizeof(WAVEFORMATEX));
pcmwf.wFormatTag = WAVE_FORMAT_PCM;
pcmwf.nChannels = 2;
pcmwf.nBlockAlign = 4;
pcmwf.nSamplesPerSec = 48000;
pcmwf.nAvgBytesPerSec = pcmwf.nSamplesPerSec * pcmwf.nBlockAlign;
pcmwf.wBitsPerSample = 16;
// create file
hWaveFile=mmioOpen(szFileName,NULL,MMIO_CREATE|MMIO_WRITE|MMIO_EXCLUSIVE | MMIO_ALLOCBUF);
if(!hWaveFile) return;
// setup WAVE, fmt and data chunks
memset(&mmckMain,0,sizeof(MMCKINFO));
mmckMain.fccType = mmioFOURCC('W','A','V','E');
mmioCreateChunk(hWaveFile,&mmckMain,MMIO_CREATERIFF);
memset(&mmckData,0,sizeof(MMCKINFO));
mmckData.ckid = mmioFOURCC('f','m','t',' ');
mmckData.cksize = sizeof(WAVEFORMATEX);
mmioCreateChunk(hWaveFile,&mmckData,0);
mmioWrite(hWaveFile,(char*)&pcmwf,sizeof(WAVEFORMATEX));
mmioAscend(hWaveFile,&mmckData,0);
mmckData.ckid = mmioFOURCC('d','a','t','a');
mmioCreateChunk(hWaveFile,&mmckData,0);
}
////////////////////////////////////////////////////////////////////////
void RecordStop()
{
// first some check, if recording is running
iDoRecord=0;
if(!hWaveFile) return;
// now finish writing & close the wave file
mmioAscend(hWaveFile,&mmckData,0);
mmioAscend(hWaveFile,&mmckMain,0);
mmioClose(hWaveFile,0);
// init var
hWaveFile=NULL;
}
////////////////////////////////////////////////////////////////////////
void RecordBuffer(unsigned char* pSound,long lBytes)
{
// write the samples
if(hWaveFile) mmioWrite(hWaveFile,pSound,lBytes);
}
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
BOOL CALLBACK RecordDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
//--------------------------------------------------// init
case WM_INITDIALOG:
{
SetDlgItemText(hW,IDC_WAVFILE,szFileName); // init filename edit
ShowCursor(TRUE); // mmm... who is hiding it? main emu? tsts
return TRUE;
}
//--------------------------------------------------// destroy
case WM_DESTROY:
{
RecordStop();
}break;
//--------------------------------------------------// command
case WM_COMMAND:
{
if(wParam==IDCANCEL) iRecordMode=2; // cancel? raise flag for destroying the dialog
if(wParam==IDC_RECORD) // record start/stop?
{
if(IsWindowEnabled(GetDlgItem(hW,IDC_WAVFILE))) // not started yet (edit is not disabled):
{
GetDlgItemText(hW,IDC_WAVFILE,szFileName,255);// get filename
RecordStart(); // start recording
if(hWaveFile) // start was ok?
{ // -> disable filename edit, change text, raise flag
EnableWindow(GetDlgItem(hW,IDC_WAVFILE),FALSE);
SetDlgItemText(hW,IDC_RECORD,"Stop recording");
iDoRecord=1;
}
else MessageBeep(0xFFFFFFFF); // error starting recording? BEEP
}
else // stop recording?
{
RecordStop(); // -> just do it
EnableWindow(GetDlgItem(hW,IDC_WAVFILE),TRUE);// -> enable filename edit again
SetDlgItemText(hW,IDC_RECORD,"Start recording");
}
SetFocus(hWMain);
}
}break;
//--------------------------------------------------// size
case WM_SIZE:
if(wParam==SIZE_MINIMIZED) SetFocus(hWMain); // if we get minimized, set the foxus to the main window
break;
//--------------------------------------------------// setcursor
case WM_SETCURSOR:
{
SetCursor(LoadCursor(NULL,IDC_ARROW)); // force the arrow
return TRUE;
}
//--------------------------------------------------//
}
return FALSE;
}
////////////////////////////////////////////////////////////////////////
#endif