aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Input/in_cdda/MCIPlay.h
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/Input/in_cdda/MCIPlay.h')
-rw-r--r--Src/Plugins/Input/in_cdda/MCIPlay.h182
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