1
0
Fork 0

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:
Patryk Obara 2019-12-13 02:33:59 +01:00 committed by Patryk Obara
parent f66a4f5416
commit 94b987b5b5
3 changed files with 28 additions and 31 deletions

View file

@ -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

View file

@ -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;
}

View file

@ -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);