4d6306eb4d
* WARNING! It is quite unstable on Windows and it doesn't work on Linux for the moment because I didn't finish fixing the CODEC stream. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@975 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
209 lines
5.2 KiB
C++
209 lines
5.2 KiB
C++
////////////////////////////////////////////////////////////////////////////////
|
|
// Name: cdwin.cpp
|
|
// Purpose: wxMMedia
|
|
// Author: Guilhem Lavaux
|
|
// Created: 1997
|
|
// Updated: 1998
|
|
// Copyright: (C) 1997, 1998, Guilhem Lavaux
|
|
// License: wxWindows license
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
#ifdef __GNUG__
|
|
#pragma implementation "cdwin.h"
|
|
#endif
|
|
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include <mmsystem.h>
|
|
#ifdef WX_PRECOMP
|
|
#include "wx/wxprec.h"
|
|
#else
|
|
#include "wx/wx.h"
|
|
#endif
|
|
#define WXMMEDIA_INTERNAL
|
|
#include "mmtype.h"
|
|
#include "cdbase.h"
|
|
#include "cdwin.h"
|
|
|
|
#ifdef __BORLANDC__
|
|
#pragma hdrstop
|
|
#endif
|
|
|
|
wxCDAudioWin::wxCDAudioWin(void)
|
|
: wxCDAudio(), m_trksize(NULL), m_trkpos(NULL), m_ok(TRUE), m_toc(NULL)
|
|
{
|
|
MCI_OPEN_PARMS open_struct;
|
|
MCI_SET_PARMS set_struct;
|
|
DWORD ret;
|
|
|
|
m_internal = new CDAW_Internal;
|
|
open_struct.lpstrDeviceType = "cdaudio";
|
|
ret = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE,
|
|
(DWORD)&open_struct);
|
|
if (ret) {
|
|
m_ok = FALSE;
|
|
return;
|
|
}
|
|
m_internal->dev_id = open_struct.wDeviceID;
|
|
|
|
set_struct.dwTimeFormat = MCI_FORMAT_MSF;
|
|
ret = mciSendCommand(m_internal->dev_id, MCI_SET, MCI_SET_TIME_FORMAT,
|
|
(DWORD)(LPVOID)&set_struct);
|
|
|
|
PrepareToc();
|
|
|
|
set_struct.dwTimeFormat = MCI_FORMAT_TMSF;
|
|
ret = mciSendCommand(m_internal->dev_id, MCI_SET, MCI_SET_TIME_FORMAT,
|
|
(DWORD)(LPVOID)&set_struct);
|
|
}
|
|
|
|
wxCDAudioWin::~wxCDAudioWin(void)
|
|
{
|
|
if (m_ok) {
|
|
mciSendCommand(m_internal->dev_id, MCI_CLOSE, 0, NULL);
|
|
delete m_toc;
|
|
delete[] m_trksize;
|
|
delete[] m_trkpos;
|
|
}
|
|
delete m_internal;
|
|
}
|
|
|
|
void wxCDAudioWin::PrepareToc(void)
|
|
{
|
|
MCI_STATUS_PARMS status_struct;
|
|
MCI_SET_PARMS set_struct;
|
|
wxUint16 i, nb_m_trksize;
|
|
wxCDtime total_time, *trk;
|
|
DWORD ret, tmem;
|
|
|
|
if (!m_ok)
|
|
return;
|
|
|
|
status_struct.dwItem = MCI_STATUS_NUMBER_OF_TRACKS;
|
|
ret = mciSendCommand(m_internal->dev_id, MCI_STATUS, MCI_STATUS_ITEM,
|
|
(DWORD)&status_struct);
|
|
nb_m_trksize = status_struct.dwReturn;
|
|
|
|
m_trksize = new wxCDtime[nb_m_trksize+1];
|
|
m_trkpos = new wxCDtime[nb_m_trksize+1];
|
|
|
|
status_struct.dwItem = MCI_STATUS_LENGTH;
|
|
ret = mciSendCommand(m_internal->dev_id, MCI_STATUS, MCI_STATUS_ITEM,
|
|
(DWORD)&status_struct);
|
|
total_time.track = nb_m_trksize;
|
|
tmem = status_struct.dwReturn;
|
|
total_time.min = MCI_MSF_MINUTE(tmem);
|
|
total_time.sec = MCI_MSF_SECOND(tmem);
|
|
total_time.hour = total_time.min / 60;
|
|
total_time.min %= 60;
|
|
|
|
for (i=1;i<=nb_m_trksize;i++) {
|
|
status_struct.dwItem = MCI_STATUS_POSITION;
|
|
status_struct.dwTrack = i;
|
|
ret = mciSendCommand(m_internal->dev_id, MCI_STATUS,
|
|
MCI_STATUS_ITEM | MCI_TRACK,
|
|
(DWORD)(LPVOID)&status_struct);
|
|
tmem = status_struct.dwReturn;
|
|
|
|
trk = &m_trkpos[i];
|
|
trk->track = i;
|
|
trk->min = MCI_MSF_MINUTE(tmem);
|
|
trk->sec = MCI_MSF_SECOND(tmem);
|
|
trk->hour = trk->min / 60;
|
|
trk->min %= 60;
|
|
|
|
status_struct.dwItem = MCI_STATUS_LENGTH;
|
|
status_struct.dwTrack = i;
|
|
ret = mciSendCommand(m_internal->dev_id, MCI_STATUS,
|
|
MCI_STATUS_ITEM | MCI_TRACK,
|
|
(DWORD)(LPVOID)&status_struct);
|
|
tmem = status_struct.dwReturn;
|
|
|
|
trk = &m_trksize[i];
|
|
trk->track = i;
|
|
trk->min = MCI_MSF_MINUTE(tmem);
|
|
trk->sec = MCI_MSF_SECOND(tmem);
|
|
trk->hour = trk->min / 60;
|
|
trk->min %= 60;
|
|
}
|
|
|
|
m_toc = new CDtoc(total_time, m_trksize, m_trkpos);
|
|
}
|
|
|
|
bool wxCDAudioWin::Play(const wxCDtime& beg_time, const wxCDtime& end_time)
|
|
{
|
|
DWORD tmsf;
|
|
MCI_PLAY_PARMS play_struct;
|
|
|
|
if (!m_ok)
|
|
return FALSE;
|
|
|
|
tmsf = MCI_MAKE_TMSF(beg_time.track, beg_time.min,
|
|
beg_time.sec, 0);
|
|
play_struct.dwFrom = tmsf;
|
|
tmsf = MCI_MAKE_TMSF(end_time.track, end_time.min,
|
|
end_time.sec, 0);
|
|
play_struct.dwTo = tmsf;
|
|
|
|
mciSendCommand(m_internal->dev_id, MCI_PLAY, 0, (DWORD)&play_struct);
|
|
return TRUE;
|
|
}
|
|
|
|
bool wxCDAudioWin::Pause(void)
|
|
{
|
|
if (!m_ok)
|
|
return FALSE;
|
|
|
|
return (mciSendCommand(m_internal->dev_id, MCI_PAUSE, 0, 0) == 0);
|
|
}
|
|
|
|
bool wxCDAudioWin::Resume(void)
|
|
{
|
|
if (!m_ok)
|
|
return FALSE;
|
|
|
|
return (mciSendCommand(m_internal->dev_id, MCI_RESUME, 0, 0) == 0);
|
|
}
|
|
|
|
wxCDAudio::CDstatus wxCDAudioWin::GetStatus(void)
|
|
{
|
|
MCI_STATUS_PARMS status_struct;
|
|
|
|
if (!m_ok)
|
|
return STOPPED;
|
|
|
|
status_struct.dwItem = MCI_STATUS_MODE;
|
|
mciSendCommand(m_internal->dev_id, MCI_STATUS, MCI_STATUS_ITEM,
|
|
(DWORD)&status_struct);
|
|
switch (status_struct.dwReturn) {
|
|
case MCI_MODE_PAUSE:
|
|
return PAUSED;
|
|
case MCI_MODE_PLAY:
|
|
return PLAYING;
|
|
}
|
|
return STOPPED;
|
|
}
|
|
|
|
wxCDtime wxCDAudioWin::GetTime(void)
|
|
{
|
|
MCI_STATUS_PARMS status_struct;
|
|
wxCDtime cd_time = {-1, -1, -1, -1};
|
|
|
|
if (!m_ok)
|
|
return cd_time;
|
|
|
|
status_struct.dwItem = MCI_STATUS_TIME_FORMAT;
|
|
mciSendCommand(m_internal->dev_id, MCI_STATUS, MCI_STATUS_ITEM,
|
|
(DWORD)&status_struct);
|
|
cd_time.track = MCI_TMSF_TRACK(status_struct.dwReturn);
|
|
cd_time.min = MCI_TMSF_MINUTE(status_struct.dwReturn);
|
|
cd_time.sec = MCI_TMSF_SECOND(status_struct.dwReturn);
|
|
cd_time.hour = cd_time.min / 60;
|
|
cd_time.min %= 60;
|
|
return cd_time;
|
|
}
|
|
|
|
wxCDAudio::CDtoc& wxCDAudioWin::GetToc(void)
|
|
{
|
|
return *m_toc;
|
|
}
|