Initial community commit
This commit is contained in:
parent
537bcbc862
commit
fc06254474
16440 changed files with 4239995 additions and 2 deletions
112
Src/Plugins/Input/in_cdda/AUDIO.Cpp
Normal file
112
Src/Plugins/Input/in_cdda/AUDIO.Cpp
Normal file
|
@ -0,0 +1,112 @@
|
|||
#include <windows.h>
|
||||
#include "Audio.h"
|
||||
#include "main.h"
|
||||
#include "api__in_cdda.h"
|
||||
|
||||
static int start_clock,paused;
|
||||
static HWAVEIN hWaveIn;
|
||||
static short data_latest[576*2];
|
||||
static short data_buffers[2][576*2];
|
||||
static WAVEHDR wave_hdrs[2];
|
||||
static HANDLE hThread;
|
||||
static DWORD WINAPI Thread(LPVOID _a);
|
||||
int a_v = -666, a_p = 0, initted = 0;
|
||||
|
||||
int audioInit(/*int sample*/)
|
||||
{
|
||||
WAVEFORMATEX wft = {0};
|
||||
DWORD threadid;
|
||||
start_clock=GetTickCount();
|
||||
paused=0;
|
||||
// if (!sample) return initted=0;
|
||||
wft.wFormatTag = WAVE_FORMAT_PCM;
|
||||
wft.nChannels = 2;
|
||||
wft.nSamplesPerSec = 44100;
|
||||
wft.nBlockAlign = 2*2;
|
||||
wft.nAvgBytesPerSec = wft.nSamplesPerSec*wft.nBlockAlign;
|
||||
wft.wBitsPerSample = 16;
|
||||
wft.cbSize = 0;
|
||||
if (waveInOpen(&hWaveIn,WAVE_MAPPER,&wft,0,0,0) != MMSYSERR_NOERROR)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
for (int x = 0; x < 2; x ++)
|
||||
{
|
||||
memset(&wave_hdrs[x],0,sizeof(wave_hdrs[x]));
|
||||
wave_hdrs[x].lpData = (char *) data_buffers[x];
|
||||
wave_hdrs[x].dwBufferLength = 576*2*sizeof(short);
|
||||
waveInPrepareHeader(hWaveIn,&wave_hdrs[x],sizeof(wave_hdrs[0]));
|
||||
waveInAddBuffer(hWaveIn,&wave_hdrs[x],sizeof(wave_hdrs[0]));
|
||||
}
|
||||
initted=1;
|
||||
done=0;
|
||||
waveInStart(hWaveIn);
|
||||
hThread = CreateThread(NULL,0,Thread,(LPVOID)&done,0,&threadid);
|
||||
SetThreadPriority(hThread, (int)AGAVE_API_CONFIG->GetInt(playbackConfigGroupGUID, L"priority", THREAD_PRIORITY_HIGHEST));
|
||||
return 0;
|
||||
}
|
||||
|
||||
void audioPause(int s)
|
||||
{
|
||||
if (s)
|
||||
{
|
||||
if (!paused)
|
||||
{
|
||||
paused=1;
|
||||
if (initted) waveInStop(hWaveIn);
|
||||
start_clock = GetTickCount()-start_clock;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (paused)
|
||||
{
|
||||
if (initted) waveInStart(hWaveIn);
|
||||
start_clock=GetTickCount()-start_clock;
|
||||
paused=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void audioQuit()
|
||||
{
|
||||
if (!initted) return;
|
||||
done=1;
|
||||
WaitForSingleObject(hThread,INFINITE);
|
||||
waveInStop(hWaveIn);
|
||||
waveInReset(hWaveIn);
|
||||
while (waveInClose(hWaveIn) == WAVERR_STILLPLAYING) Sleep(10);
|
||||
CloseHandle(hThread);
|
||||
}
|
||||
|
||||
int audioGetPos()
|
||||
{
|
||||
if (paused) return start_clock;
|
||||
return GetTickCount()-start_clock;
|
||||
}
|
||||
|
||||
|
||||
void audioSetPos(int ms)
|
||||
{
|
||||
start_clock = GetTickCount()-ms;
|
||||
}
|
||||
|
||||
static DWORD WINAPI Thread(LPVOID _a)
|
||||
{
|
||||
volatile int *a = (volatile int *)_a;
|
||||
int w;
|
||||
while (!*a)
|
||||
{
|
||||
Sleep(576000/44100);
|
||||
if (wave_hdrs[0].dwFlags & WHDR_DONE) w=0;
|
||||
else if (wave_hdrs[1].dwFlags & WHDR_DONE) w=1;
|
||||
else continue;
|
||||
memcpy(data_latest,wave_hdrs[w].lpData,576*2*sizeof(short));
|
||||
wave_hdrs[w].dwFlags=WHDR_PREPARED;
|
||||
waveInAddBuffer(hWaveIn,&wave_hdrs[w],sizeof(wave_hdrs[0]));
|
||||
// memset(data_latest,0,576*2*sizeof(short));
|
||||
line.VSAAddPCMData(data_latest,2,16,0);
|
||||
line.SAAddPCMData(data_latest,2,16,0);
|
||||
}
|
||||
return 0;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue