Update MSF conversion functions
All usecases, that required these functions to pass 3 values separately are now gone, we can simply pass/return a struct now.
This commit is contained in:
parent
f66a4f5416
commit
94b987b5b5
3 changed files with 28 additions and 31 deletions
|
@ -46,11 +46,12 @@
|
|||
#define REDBOOK_PCM_BYTES_PER_MS 176.4f // 44.1 frames/ms * 4 bytes/frame
|
||||
#define BYTES_PER_REDBOOK_PCM_FRAME 4 // 2 bytes/sample * 2 samples/frame
|
||||
|
||||
typedef struct SMSF {
|
||||
struct TMSF
|
||||
{
|
||||
unsigned char min;
|
||||
unsigned char sec;
|
||||
unsigned char fr;
|
||||
} TMSF;
|
||||
};
|
||||
|
||||
typedef struct SCtrl {
|
||||
Bit8u out[4]; // output channel mapping
|
||||
|
@ -59,19 +60,22 @@ typedef struct SCtrl {
|
|||
|
||||
// Conversion function from frames to Minutes/Second/Frames
|
||||
//
|
||||
template<typename T>
|
||||
inline void frames_to_msf(int frames, T *m, T *s, T *f) {
|
||||
*f = frames % REDBOOK_FRAMES_PER_SECOND;
|
||||
inline TMSF frames_to_msf(int frames)
|
||||
{
|
||||
TMSF msf = {0, 0, 0};
|
||||
msf.fr = frames % REDBOOK_FRAMES_PER_SECOND;
|
||||
frames /= REDBOOK_FRAMES_PER_SECOND;
|
||||
*s = frames % 60;
|
||||
msf.sec = frames % 60;
|
||||
frames /= 60;
|
||||
*m = frames;
|
||||
msf.min = frames;
|
||||
return msf;
|
||||
}
|
||||
|
||||
// Conversion function from Minutes/Second/Frames to frames
|
||||
//
|
||||
inline int msf_to_frames(int m, int s, int f) {
|
||||
return m * 60 * REDBOOK_FRAMES_PER_SECOND + s * REDBOOK_FRAMES_PER_SECOND + f;
|
||||
inline int msf_to_frames(const TMSF &msf)
|
||||
{
|
||||
return msf.min * 60 * REDBOOK_FRAMES_PER_SECOND + msf.sec * REDBOOK_FRAMES_PER_SECOND + msf.fr;
|
||||
}
|
||||
|
||||
class CDROM_Interface
|
||||
|
|
|
@ -303,10 +303,7 @@ bool CDROM_Interface_Image::GetAudioTracks(int& start_track_num, int& lead_out_n
|
|||
start_track_num = tracks.begin()->number;
|
||||
track_const_iter lead_out(prev(tracks.end()));
|
||||
lead_out_num = lead_out->number;
|
||||
frames_to_msf(lead_out->start + 150,
|
||||
&lead_out_msf.min,
|
||||
&lead_out_msf.sec,
|
||||
&lead_out_msf.fr);
|
||||
lead_out_msf = frames_to_msf(lead_out->start + 150);
|
||||
#ifdef DEBUG
|
||||
LOG_MSG("CDROM: GetAudioTracks => start track is %2d, lead out track is %2d, "
|
||||
"and lead out MSF is %02d:%02d:%02d",
|
||||
|
@ -337,7 +334,7 @@ bool CDROM_Interface_Image::GetAudioTrackInfo(int requested_track_num,
|
|||
|
||||
const tracks_size_t requested_track_index(requested_track_num - 1);
|
||||
track_const_iter track(tracks.begin() + requested_track_index);
|
||||
frames_to_msf(track->start + 150, &start_msf.min, &start_msf.sec, &start_msf.fr);
|
||||
start_msf = frames_to_msf(track->start + 150);
|
||||
attr = track->attr;
|
||||
#ifdef DEBUG
|
||||
LOG_MSG("CDROM: GetAudioTrackInfo for track %d => "
|
||||
|
@ -346,7 +343,7 @@ bool CDROM_Interface_Image::GetAudioTrackInfo(int requested_track_num,
|
|||
start_msf.min,
|
||||
start_msf.sec,
|
||||
start_msf.fr,
|
||||
msf_to_frames(start_msf.min, start_msf.sec, start_msf.fr));
|
||||
msf_to_frames(start_msf));
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
@ -388,14 +385,8 @@ bool CDROM_Interface_Image::GetAudioSub(unsigned char& attr, unsigned char& trac
|
|||
track_num = track->number;
|
||||
attr = track->attr;
|
||||
index = 1;
|
||||
frames_to_msf(currentSector + 150,
|
||||
&absPos.min,
|
||||
&absPos.sec,
|
||||
&absPos.fr);
|
||||
frames_to_msf(currentSector - track->start,
|
||||
&relPos.min,
|
||||
&relPos.sec,
|
||||
&relPos.fr);
|
||||
absPos = frames_to_msf(currentSector + 150);
|
||||
relPos = frames_to_msf(currentSector - track->start);
|
||||
#ifdef DEBUG
|
||||
LOG_MSG("CDROM: GetAudioSub => playing at %02d:%02d:%02d (on sector %u) "
|
||||
"in track %u at its %02d:%02d:%02d (at its sector %d)",
|
||||
|
@ -1193,11 +1184,11 @@ bool CDROM_Interface_Image::GetCueKeyword(string &keyword, istream &in)
|
|||
|
||||
bool CDROM_Interface_Image::GetCueFrame(int &frames, istream &in)
|
||||
{
|
||||
string msf;
|
||||
std::string msf;
|
||||
in >> msf;
|
||||
int min, sec, fr;
|
||||
bool success = sscanf(msf.c_str(), "%d:%d:%d", &min, &sec, &fr) == 3;
|
||||
frames = msf_to_frames(min, sec, fr);
|
||||
TMSF tmp = {0, 0, 0};
|
||||
bool success = sscanf(msf.c_str(), "%hhu:%hhu:%hhu", &tmp.min, &tmp.sec, &tmp.fr) == 3;
|
||||
frames = msf_to_frames(tmp);
|
||||
return success;
|
||||
}
|
||||
|
||||
|
|
|
@ -878,10 +878,12 @@ static Bit16u MSCDEX_IOCTL_Input(PhysPt buffer,Bit8u drive_unit) {
|
|||
TMSF pos = {0, 0, 0};
|
||||
mscdex->GetCurrentPos(drive_unit,pos);
|
||||
Bit8u addr_mode = mem_readb(buffer+1);
|
||||
if (addr_mode==0) { // HSG
|
||||
Bit32u frames = msf_to_frames(pos.min, pos.sec, pos.fr);
|
||||
if (frames<150) MSCDEX_LOG("MSCDEX: Get position: invalid position %d:%d:%d", pos.min, pos.sec, pos.fr);
|
||||
else frames-=150;
|
||||
if (addr_mode == 0) { // HSG
|
||||
Bit32u frames = static_cast<Bit32u>(msf_to_frames(pos));
|
||||
if (frames < 150)
|
||||
MSCDEX_LOG("MSCDEX: Get position: invalid position %d:%d:%d", pos.min, pos.sec, pos.fr);
|
||||
else
|
||||
frames -= 150;
|
||||
mem_writed(buffer+2,frames);
|
||||
} else if (addr_mode==1) { // Red book
|
||||
mem_writeb(buffer+2,pos.fr);
|
||||
|
|
Loading…
Add table
Reference in a new issue