diff --git a/src/dos/cdrom.h b/src/dos/cdrom.h index e67c1251..b7d6df71 100644 --- a/src/dos/cdrom.h +++ b/src/dos/cdrom.h @@ -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 -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 diff --git a/src/dos/cdrom_image.cpp b/src/dos/cdrom_image.cpp index 42bce965..1d186e89 100644 --- a/src/dos/cdrom_image.cpp +++ b/src/dos/cdrom_image.cpp @@ -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; } diff --git a/src/dos/dos_mscdex.cpp b/src/dos/dos_mscdex.cpp index 56f4ea11..c51b6dd5 100644 --- a/src/dos/dos_mscdex.cpp +++ b/src/dos/dos_mscdex.cpp @@ -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(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);