diff options
Diffstat (limited to 'Src/Plugins/Input/in_cdda/MCIPlay.h')
-rw-r--r-- | Src/Plugins/Input/in_cdda/MCIPlay.h | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/Src/Plugins/Input/in_cdda/MCIPlay.h b/Src/Plugins/Input/in_cdda/MCIPlay.h new file mode 100644 index 00000000..fe8e43ad --- /dev/null +++ b/Src/Plugins/Input/in_cdda/MCIPlay.h @@ -0,0 +1,182 @@ +#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
\ No newline at end of file |