winamp/Src/Plugins/Input/in_cdda/MCIPlay.h
2024-09-24 14:54:57 +02:00

182 lines
3.9 KiB
C++

#ifndef NULLSOFT_MCIPLAYH
#define NULLSOFT_MCIPLAYH
#include "CDPlay.h"
#include "main.h"
class MciPlay : public C_CDPlay {
public:
MciPlay()
{
posinms=0;
}
int play(wchar_t drive, int track)
{
g_drive = drive;
{
MCI_SET_PARMS sMCISet;
g_playtrack = track;
if (!CDOpen(&playdev, drive, L"mci"))
{
playdev=0;
g_drive = 0;
return 1;
}
sMCISet.dwTimeFormat = MCI_FORMAT_MILLISECONDS;
MCISendCommand (playdev, MCI_SET, MCI_SET_TIME_FORMAT, (DWORD_PTR) (LPVOID) &sMCISet);
g_playlength=CDGetTrackLength(playdev,g_playtrack);
sMCISet.dwTimeFormat = MCI_FORMAT_TMSF;
MCISendCommand (playdev, MCI_SET, MCI_SET_TIME_FORMAT, (DWORD_PTR) (LPVOID) &sMCISet);
if (CDPlay(playdev,g_playtrack,FALSE,0,0,g_playlength))
{
CDClose(&playdev);
playdev=0;
g_drive = 0;
return 1;
}
line.is_seekable=1;
}
line.SetInfo(1411,44,2,1);
line.SAVSAInit(0,44100);
line.VSASetInfo(2,44100);
setvolume(a_v, a_p);
{
short dta[576*2] = {0};
line.VSAAddPCMData(dta,2,16,0);
line.SAAddPCMData(dta,2,16,0);
}
if (audioInit(/*config_sample*/))
{
}
return 0;
}
void stop()
{
//CDStop(playdev);
if (!done) CDPause(playdev);
CDClose(&playdev);
audioQuit();
}
void pause()
{
posinms=audioGetPos();
CDPause(playdev);
audioPause(1);
}
void unpause()
{
int pos=audioGetPos();
CDPlay(playdev, g_playtrack, TRUE,pos/60000,(pos/1000)%60,g_playlength);
audioPause(0);
}
int getlength()
{
return g_playlength;
}
int getoutputtime()
{
int p;
if (paused)
{
return posinms;
}
p=audioGetPos();
if (GetCurrentThreadId()==MainThreadId)
{
if ((p > g_playlength || (p-g_lastpos > 2000 && !isMediaPresent(playdev))) && !done)
{
done=1;
PostMessage(line.hMainWindow,WM_WA_MPEG_EOF,0,0);
}
if (g_lastpos > p+2000)
g_lastpos=p;
}
return p;
}
void setoutputtime(int time_in_ms)
{
CDPlay(playdev,g_playtrack,FALSE,time_in_ms/60000,(time_in_ms/1000)%60,g_playlength);
if (paused)
{
audioPause(0);
}
audioSetPos(time_in_ms);
g_lastpos=time_in_ms;
if (paused)
{
audioPause(1);
CDPause(playdev);
}
done=0;
}
void setvolume(int _a_v, int _a_p) {
HMIXER hmix;
int vol1, vol2;
if (_a_v < 0) _a_v = 0;
if (_a_v > 255) _a_v = 255;
if (_a_p < -127) _a_p = -127;
if (_a_p > 127) _a_p = 127;
vol1 = vol2 = (_a_v*2048) / 255;
if (_a_p > 0)
{
vol1 *= (127-_a_p);
vol1 /= 127;
}
else if (_a_p < 0)
{
vol2 *= (_a_p+127);
vol2 /= 127;
}
if (mixerOpen(&hmix,0,0,0,0) == MMSYSERR_NOERROR)
{
MIXERLINE ml={sizeof(ml),0};
ml.dwComponentType=MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC;
if (mixerGetLineInfo((HMIXEROBJ)hmix,&ml,MIXER_GETLINEINFOF_COMPONENTTYPE) == MMSYSERR_NOERROR)
{
MIXERLINECONTROLS mlc = {sizeof(mlc),ml.dwLineID,};
MIXERCONTROL mc={sizeof(mc),};
mlc.cControls=1;
mlc.cbmxctrl=sizeof(mc);
mlc.pamxctrl=&mc;
mlc.dwControlType=MIXERCONTROL_CONTROLTYPE_VOLUME;
if (mixerGetLineControls((HMIXEROBJ)hmix,&mlc,MIXER_GETLINECONTROLSF_ONEBYTYPE) == MMSYSERR_NOERROR)
{
MIXERCONTROLDETAILS mcd = {sizeof(mcd),mc.dwControlID,ml.cChannels,};
MIXERCONTROLDETAILS_UNSIGNED v[2];
mcd.cbDetails=sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mcd.paDetails=v;
v[0].dwValue=mc.Bounds.dwMinimum + (vol1*(mc.Bounds.dwMaximum-mc.Bounds.dwMinimum))/2048;
v[1].dwValue=mc.Bounds.dwMinimum + (vol2*(mc.Bounds.dwMaximum-mc.Bounds.dwMinimum))/2048;
if (mixerSetControlDetails((HMIXEROBJ)hmix,&mcd,0) == MMSYSERR_NOERROR)
{
// yay we're done!
}
// else MessageBox(NULL,"mixerSetLineControlDetails()","Error",MB_OK);
}
//else MessageBox(NULL,"mixerGetLineControls()","Error",MB_OK);
}
// else MessageBox(NULL,"mixerGetLineInfo()","Error",MB_OK);
mixerClose(hmix);
}
//else MessageBox(NULL,"MixerOpen()","Error",MB_OK);
}
private:
int posinms;
MCIDEVICEID playdev;
};
#endif