Refine types and eliminate implicit-casting and magic-numbers
The commit refines several types to their logical use-cases. For example, a CDROM will at-most contain 400,000 sectors and be less than 1B bytes in size. Likewise, both are 'physical' quantities and this should always be zero-or-greater (therefore, uint32_t is used). Fortunately, there are almost no cases where these values are overloaded to mean something else (ie: negative return codes to indicate failure). Besides eliminating many implicit cast warnings, differing-signed comparison warnings, and overflowable type-cast warnings, the more correct use of types helps logically bound expectations of the values they contain, which should improve maintainability.
This commit is contained in:
parent
459f7d32f9
commit
1393c1316c
3 changed files with 150 additions and 119 deletions
|
@ -71,20 +71,20 @@ typedef struct SCtrl {
|
|||
|
||||
// Conversion function from frames to Minutes/Second/Frames
|
||||
//
|
||||
inline TMSF frames_to_msf(int frames)
|
||||
inline TMSF frames_to_msf(uint32_t frames)
|
||||
{
|
||||
TMSF msf = {0, 0, 0};
|
||||
msf.fr = frames % REDBOOK_FRAMES_PER_SECOND;
|
||||
frames /= REDBOOK_FRAMES_PER_SECOND;
|
||||
msf.sec = frames % 60;
|
||||
frames /= 60;
|
||||
msf.min = frames;
|
||||
msf.min = static_cast<uint8_t>(frames);
|
||||
return msf;
|
||||
}
|
||||
|
||||
// Conversion function from Minutes/Second/Frames to frames
|
||||
//
|
||||
inline int msf_to_frames(const TMSF &msf)
|
||||
inline uint32_t msf_to_frames(const TMSF &msf)
|
||||
{
|
||||
return msf.min * 60 * REDBOOK_FRAMES_PER_SECOND + msf.sec * REDBOOK_FRAMES_PER_SECOND + msf.fr;
|
||||
}
|
||||
|
@ -100,11 +100,11 @@ public:
|
|||
virtual bool GetAudioSub (unsigned char& attr, unsigned char& track, unsigned char& index, TMSF& relPos, TMSF& absPos) = 0;
|
||||
virtual bool GetAudioStatus (bool& playing, bool& pause) = 0;
|
||||
virtual bool GetMediaTrayStatus (bool& mediaPresent, bool& mediaChanged, bool& trayOpen) = 0;
|
||||
virtual bool PlayAudioSector (uint64_t start, uint64_t len) = 0;
|
||||
virtual bool PlayAudioSector (const uint32_t start, uint32_t len) = 0;
|
||||
virtual bool PauseAudio (bool resume) = 0;
|
||||
virtual bool StopAudio (void) = 0;
|
||||
virtual void ChannelControl (TCtrl ctrl) = 0;
|
||||
virtual bool ReadSectors (PhysPt buffer, bool raw, unsigned long sector, unsigned long num) = 0;
|
||||
virtual bool ReadSectors (PhysPt buffer, const bool raw, const uint32_t sector, const uint16_t num) = 0;
|
||||
virtual bool LoadUnloadMedia (bool unload) = 0;
|
||||
virtual void InitNewMedia (void) {};
|
||||
};
|
||||
|
@ -119,12 +119,14 @@ public:
|
|||
bool GetAudioSub (unsigned char& attr, unsigned char& track, unsigned char& index, TMSF& relPos, TMSF& absPos);
|
||||
bool GetAudioStatus (bool& playing, bool& pause);
|
||||
bool GetMediaTrayStatus (bool& mediaPresent, bool& mediaChanged, bool& trayOpen);
|
||||
bool PlayAudioSector (uint64_t start, uint64_t len) { (void)start; (void)len; return true; };
|
||||
bool PlayAudioSector (const uint32_t start, uint32_t len) { (void)start; (void)len; return true; };
|
||||
bool PauseAudio (bool /*resume*/) { return true; };
|
||||
bool StopAudio (void) { return true; };
|
||||
void ChannelControl (TCtrl ctrl) { (void)ctrl; // unused by part of the API
|
||||
return; };
|
||||
bool ReadSectors (PhysPt /*buffer*/, bool /*raw*/, unsigned long /*sector*/, unsigned long /*num*/) { return true; };
|
||||
void ChannelControl (TCtrl ctrl) {
|
||||
(void) ctrl; // unused by part of the API
|
||||
return;
|
||||
};
|
||||
bool ReadSectors (PhysPt /*buffer*/, const bool /*raw*/, const uint32_t /*sector*/, const uint16_t /*num*/) { return true; };
|
||||
bool LoadUnloadMedia (bool /*unload*/) { return true; };
|
||||
};
|
||||
|
||||
|
@ -141,7 +143,7 @@ private:
|
|||
const uint32_t offset,
|
||||
const uint32_t requested_bytes) = 0;
|
||||
virtual bool seek(const uint32_t offset) = 0;
|
||||
virtual uint64_t decode(Bit16s *buffer, uint32_t desired_track_frames) = 0;
|
||||
virtual uint32_t decode(int16_t *buffer, const uint32_t desired_track_frames) = 0;
|
||||
virtual Bit16u getEndian() = 0;
|
||||
virtual Bit32u getRate() = 0;
|
||||
virtual Bit8u getChannels() = 0;
|
||||
|
@ -162,7 +164,7 @@ private:
|
|||
const uint32_t offset,
|
||||
const uint32_t requested_bytes);
|
||||
bool seek(const uint32_t offset);
|
||||
uint64_t decode(Bit16s *buffer, Bit32u desired_track_frames);
|
||||
uint32_t decode(int16_t *buffer, const uint32_t desired_track_frames);
|
||||
Bit16u getEndian();
|
||||
Bit32u getRate() { return 44100; }
|
||||
Bit8u getChannels() { return 2; }
|
||||
|
@ -184,14 +186,14 @@ private:
|
|||
const uint32_t offset,
|
||||
const uint32_t requested_bytes);
|
||||
bool seek(const uint32_t offset);
|
||||
uint64_t decode(Bit16s *buffer, Bit32u desired_track_frames);
|
||||
uint32_t decode(int16_t *buffer, const uint32_t desired_track_frames);
|
||||
Bit16u getEndian();
|
||||
Bit32u getRate();
|
||||
Bit8u getChannels();
|
||||
int getLength();
|
||||
private:
|
||||
Sound_Sample *sample;
|
||||
uint32_t position;
|
||||
Sound_Sample *sample = nullptr;
|
||||
uint32_t track_pos = 0;
|
||||
};
|
||||
|
||||
public:
|
||||
|
@ -208,7 +210,7 @@ public:
|
|||
};
|
||||
CDROM_Interface_Image (Bit8u _subUnit);
|
||||
virtual ~CDROM_Interface_Image (void);
|
||||
void InitNewMedia (void);
|
||||
void InitNewMedia (void) {};
|
||||
bool SetDevice (char *path);
|
||||
bool GetUPC (unsigned char& attr, char* upc);
|
||||
bool GetAudioTracks (uint8_t& stTrack, uint8_t& end, TMSF& leadOut);
|
||||
|
@ -216,13 +218,13 @@ public:
|
|||
bool GetAudioSub (unsigned char& attr, unsigned char& track, unsigned char& index, TMSF& relPos, TMSF& absPos);
|
||||
bool GetAudioStatus (bool& playing, bool& pause);
|
||||
bool GetMediaTrayStatus (bool& mediaPresent, bool& mediaChanged, bool& trayOpen);
|
||||
bool PlayAudioSector (uint64_t start, uint64_t len);
|
||||
bool PlayAudioSector (const uint32_t start, uint32_t len);
|
||||
bool PauseAudio (bool resume);
|
||||
bool StopAudio (void);
|
||||
void ChannelControl (TCtrl ctrl);
|
||||
bool ReadSectors (PhysPt buffer, bool raw, unsigned long sector, unsigned long num);
|
||||
bool ReadSectors (PhysPt buffer, const bool raw, const uint32_t sector, const uint16_t num);
|
||||
bool LoadUnloadMedia (bool unload);
|
||||
bool ReadSector (Bit8u *buffer, bool raw, unsigned long sector);
|
||||
bool ReadSector (uint8_t *buffer, const bool raw, const uint32_t sector);
|
||||
bool HasDataTrack (void);
|
||||
static CDROM_Interface_Image* images[26];
|
||||
|
||||
|
@ -235,8 +237,8 @@ private:
|
|||
MixerChannel *channel = nullptr;
|
||||
CDROM_Interface_Image *cd = nullptr;
|
||||
void (MixerChannel::*addFrames) (Bitu, const Bit16s*) = nullptr;
|
||||
uint64_t playedTrackFrames = 0;
|
||||
uint64_t totalTrackFrames = 0;
|
||||
uint32_t playedTrackFrames = 0;
|
||||
uint32_t totalTrackFrames = 0;
|
||||
uint32_t startSector = 0;
|
||||
uint32_t totalRedbookFrames = 0;
|
||||
int16_t buffer[MIXER_BUFSIZE * REDBOOK_CHANNELS] = {0};
|
||||
|
@ -246,7 +248,9 @@ private:
|
|||
|
||||
// Private utility functions
|
||||
bool LoadIsoFile(char *filename);
|
||||
bool CanReadPVD(TrackFile *file, int sectorSize, bool mode2);
|
||||
bool CanReadPVD(TrackFile *file,
|
||||
const uint16_t sectorSize,
|
||||
const bool mode2);
|
||||
std::vector<Track>::iterator GetTrack(const uint32_t sector);
|
||||
static void CDAudioCallBack (Bitu desired_frames);
|
||||
|
||||
|
@ -254,15 +258,19 @@ private:
|
|||
bool LoadCueSheet(char *cuefile);
|
||||
bool GetRealFileName(std::string& filename, std::string& pathname);
|
||||
bool GetCueKeyword(std::string &keyword, std::istream &in);
|
||||
bool GetCueFrame(int &frames, std::istream &in);
|
||||
bool GetCueFrame(uint32_t &frames, std::istream &in);
|
||||
bool GetCueString(std::string &str, std::istream &in);
|
||||
bool AddTrack(Track &curr, int &shift, int prestart, int &totalPregap, int currPregap);
|
||||
|
||||
bool AddTrack(Track &curr,
|
||||
uint32_t &shift,
|
||||
const int32_t prestart,
|
||||
uint32_t &totalPregap,
|
||||
uint32_t currPregap);
|
||||
// member variables
|
||||
std::vector<Track> tracks;
|
||||
std::string mcn;
|
||||
static int refCount;
|
||||
Bit8u subUnit;
|
||||
std::vector<Track> tracks;
|
||||
std::vector<uint8_t> readBuffer;
|
||||
std::string mcn;
|
||||
static int refCount;
|
||||
uint8_t subUnit;
|
||||
};
|
||||
|
||||
#endif /* __CDROM_INTERFACE__ */
|
||||
|
|
|
@ -119,7 +119,8 @@ bool CDROM_Interface_Image::BinaryFile::seek(const uint32_t offset)
|
|||
return !file->fail();
|
||||
}
|
||||
|
||||
uint64_t CDROM_Interface_Image::BinaryFile::decode(Bit16s *buffer, Bit32u desired_track_frames)
|
||||
uint32_t CDROM_Interface_Image::BinaryFile::decode(int16_t *buffer,
|
||||
const uint32_t desired_track_frames)
|
||||
{
|
||||
// Guard: only proceed with a valid file
|
||||
if (file == nullptr)
|
||||
|
@ -130,9 +131,7 @@ uint64_t CDROM_Interface_Image::BinaryFile::decode(Bit16s *buffer, Bit32u desire
|
|||
}
|
||||
|
||||
CDROM_Interface_Image::AudioFile::AudioFile(const char *filename, bool &error)
|
||||
: TrackFile(4096),
|
||||
sample(nullptr),
|
||||
position(0)
|
||||
: TrackFile(4096)
|
||||
{
|
||||
// Use the audio file's actual sample rate and number of channels as opposed to overriding
|
||||
Sound_AudioInfo desired = {AUDIO_S16, 0, 0};
|
||||
|
@ -189,7 +188,7 @@ bool CDROM_Interface_Image::AudioFile::seek(const uint32_t offset)
|
|||
}
|
||||
|
||||
bool CDROM_Interface_Image::AudioFile::read(uint8_t *buffer,
|
||||
const uint32_t offset,
|
||||
const uint32_t requested_pos,
|
||||
const uint32_t requested_bytes)
|
||||
{
|
||||
// Check for logic bugs
|
||||
|
@ -240,7 +239,8 @@ bool CDROM_Interface_Image::AudioFile::read(uint8_t *buffer,
|
|||
return !(sample->flags & SOUND_SAMPLEFLAG_ERROR);
|
||||
}
|
||||
|
||||
uint64_t CDROM_Interface_Image::AudioFile::decode(Bit16s *buffer, Bit32u desired_track_frames)
|
||||
uint32_t CDROM_Interface_Image::AudioFile::decode(int16_t *buffer,
|
||||
const uint32_t desired_track_frames)
|
||||
{
|
||||
return Sound_Decode_Direct(sample, (void*)buffer, desired_track_frames);
|
||||
}
|
||||
|
@ -265,7 +265,8 @@ int CDROM_Interface_Image::AudioFile::getLength()
|
|||
// Sound_GetDuration returns milliseconds but getLength()
|
||||
// needs to return bytes, so we covert using PCM bytes/s
|
||||
return sample ?
|
||||
Sound_GetDuration(sample) * REDBOOK_PCM_BYTES_PER_MS : -1;
|
||||
static_cast<int>
|
||||
(Sound_GetDuration(sample) * REDBOOK_PCM_BYTES_PER_MS) : -1;
|
||||
}
|
||||
|
||||
// initialize static members
|
||||
|
@ -298,23 +299,18 @@ CDROM_Interface_Image::~CDROM_Interface_Image()
|
|||
{
|
||||
refCount--;
|
||||
|
||||
// Ensure the global player and mixer states are stopped
|
||||
// before we drop our last CD drive.
|
||||
// Stop playback before wiping out the CD Player
|
||||
if (refCount == 0 && player.cd) {
|
||||
StopAudio();
|
||||
SDL_DestroyMutex(player.mutex);
|
||||
player.mutex = nullptr;
|
||||
#ifdef DEBUG
|
||||
LOG_MSG("CDROM: Released CD Player resources");
|
||||
#endif
|
||||
}
|
||||
if (player.cd == this) {
|
||||
player.cd = nullptr;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
LOG_MSG("CDROM: Released and cleared resources");
|
||||
#endif
|
||||
}
|
||||
|
||||
void CDROM_Interface_Image::InitNewMedia()
|
||||
{
|
||||
}
|
||||
|
||||
bool CDROM_Interface_Image::SetDevice(char* path)
|
||||
|
@ -356,7 +352,7 @@ bool CDROM_Interface_Image::GetAudioTracks(uint8_t& start_track_num,
|
|||
}
|
||||
start_track_num = tracks.front().number;
|
||||
end_track_num = next(tracks.crbegin())->number; // next(crbegin) == [vec.size - 2]
|
||||
lead_out_msf = frames_to_msf(tracks.back().start + 150);
|
||||
lead_out_msf = frames_to_msf(tracks.back().start + REDBOOK_FRAME_PADDING);
|
||||
#ifdef DEBUG
|
||||
LOG_MSG("CDROM: GetAudioTracks => start track is %2d, last playable track is %2d, "
|
||||
"and lead-out MSF is %02d:%02d:%02d",
|
||||
|
@ -386,9 +382,9 @@ bool CDROM_Interface_Image::GetAudioTrackInfo(uint8_t requested_track_num,
|
|||
return false;
|
||||
}
|
||||
|
||||
const tracks_size_t requested_track_index = requested_track_num - 1;
|
||||
const int requested_track_index = static_cast<int>(requested_track_num) - 1;
|
||||
track_const_iter track = tracks.begin() + requested_track_index;
|
||||
start_msf = frames_to_msf(track->start + 150);
|
||||
start_msf = frames_to_msf(track->start + REDBOOK_FRAME_PADDING);
|
||||
attr = track->attr;
|
||||
#ifdef DEBUG
|
||||
LOG_MSG("CDROM: GetAudioTrackInfo for track %u => "
|
||||
|
@ -422,14 +418,13 @@ bool CDROM_Interface_Image::GetAudioSub(unsigned char& attr,
|
|||
const auto track_file = player.trackFile.lock();
|
||||
if (track_file) {
|
||||
const uint32_t sample_rate = track_file->getRate();
|
||||
const uint32_t played_frames = (player.playedTrackFrames
|
||||
* REDBOOK_FRAMES_PER_SECOND
|
||||
+ sample_rate - 1) / sample_rate;
|
||||
const uint32_t played_frames = ceil_divide(player.playedTrackFrames
|
||||
* REDBOOK_FRAMES_PER_SECOND, sample_rate);
|
||||
absolute_sector = player.startSector + played_frames;
|
||||
track_iter current_track = GetTrack(absolute_sector);
|
||||
if (current_track != tracks.end()) {
|
||||
track = current_track;
|
||||
relative_sector = absolute_sector >= track->start ?
|
||||
relative_sector = absolute_sector >= track->start ?
|
||||
absolute_sector - track->start : 0;
|
||||
} else { // otherwise fallback to the beginning track
|
||||
absolute_sector = track->start;
|
||||
|
@ -442,21 +437,21 @@ bool CDROM_Interface_Image::GetAudioSub(unsigned char& attr,
|
|||
track = it;
|
||||
absolute_sector = it->start;
|
||||
break;
|
||||
} // otherwise fallback to the beginning track
|
||||
} // otherwise fallback to the beginning track
|
||||
}
|
||||
}
|
||||
attr = track->attr;
|
||||
track_num = track->number;
|
||||
}
|
||||
absolute_msf = frames_to_msf(absolute_sector + 150);
|
||||
absolute_msf = frames_to_msf(absolute_sector + REDBOOK_FRAME_PADDING);
|
||||
relative_msf = frames_to_msf(relative_sector);
|
||||
#ifdef DEBUG
|
||||
LOG_MSG("CDROM: GetAudioSub => position at %02d:%02d:%02d (on sector %u) "
|
||||
LOG_MSG("CDROM: GetAudioSub => track_pos at %02d:%02d:%02d (on sector %u) "
|
||||
"within track %u at %02d:%02d:%02d (at its sector %u)",
|
||||
absolute_msf.min,
|
||||
absolute_msf.sec,
|
||||
absolute_msf.fr,
|
||||
absolute_sector + 150,
|
||||
absolute_sector + REDBOOK_FRAME_PADDING,
|
||||
track_num,
|
||||
relative_msf.min,
|
||||
relative_msf.sec,
|
||||
|
@ -492,7 +487,7 @@ bool CDROM_Interface_Image::GetMediaTrayStatus(bool& mediaPresent, bool& mediaCh
|
|||
return true;
|
||||
}
|
||||
|
||||
bool CDROM_Interface_Image::PlayAudioSector(uint64_t start, uint64_t len)
|
||||
bool CDROM_Interface_Image::PlayAudioSector(const uint32_t start, uint32_t len)
|
||||
{
|
||||
// Find the track that holds the requested sector
|
||||
track_const_iter track = GetTrack(start);
|
||||
|
@ -513,23 +508,19 @@ bool CDROM_Interface_Image::PlayAudioSector(uint64_t start, uint64_t len)
|
|||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
// Convert the requested absolute start sector to a byte offset relative to the track's start
|
||||
// Note: even though 'GetTrack() has determined the requested sector falls within our given
|
||||
// track, it's still possible that the sector is outside of the "physical" bounds of the
|
||||
// file itself - such as in the pre-gap region. Therefore, we clamp the offset within the
|
||||
// bounds of the actual track.
|
||||
|
||||
const int relative_start = start - track->start;
|
||||
// If the request falls in the pregap we deduct the difference from the playback duration.
|
||||
if (relative_start < 0) {
|
||||
len -= relative_start;
|
||||
}
|
||||
/**
|
||||
* If the request falls in the pregap we deduct the difference from the
|
||||
* playback duration, because we skip the pre-gap area and jump straight to
|
||||
* the track start.
|
||||
*/
|
||||
if (start < track->start)
|
||||
len -= (track->start - start);
|
||||
|
||||
// Seek to the calculated byte offset, bounded to the valid byte offsets
|
||||
const int offset = (track->skip
|
||||
+ clamp(relative_start, 0, static_cast<int>(track->length - 1))
|
||||
* track->sectorSize);
|
||||
const uint32_t offset = (track->skip
|
||||
+ clamp(start - static_cast<uint32_t>(track->start),
|
||||
0u, track->length - 1)
|
||||
* track->sectorSize);
|
||||
|
||||
// Guard: Bail if our track could not be seeked
|
||||
if (!track_file->seek(offset)) {
|
||||
|
@ -541,8 +532,8 @@ bool CDROM_Interface_Image::PlayAudioSector(uint64_t start, uint64_t len)
|
|||
}
|
||||
|
||||
// Get properties about the current track
|
||||
const Bit8u track_channels = track_file->getChannels();
|
||||
const uint64_t track_rate = track_file->getRate();
|
||||
const uint8_t track_channels = track_file->getChannels();
|
||||
const uint32_t track_rate = track_file->getRate();
|
||||
|
||||
// Guard:
|
||||
// Before we update our player object with new track details, we lock access
|
||||
|
@ -670,7 +661,10 @@ void CDROM_Interface_Image::ChannelControl(TCtrl ctrl)
|
|||
#endif
|
||||
}
|
||||
|
||||
bool CDROM_Interface_Image::ReadSectors(PhysPt buffer, bool raw, unsigned long sector, unsigned long num)
|
||||
bool CDROM_Interface_Image::ReadSectors(PhysPt buffer,
|
||||
const bool raw,
|
||||
const uint32_t sector,
|
||||
const uint16_t num)
|
||||
{
|
||||
int sectorSize = (raw ? BYTES_PER_RAW_REDBOOK_FRAME : BYTES_PER_COOKED_REDBOOK_FRAME);
|
||||
Bitu buflen = num * sectorSize;
|
||||
|
@ -748,26 +742,28 @@ track_iter CDROM_Interface_Image::GetTrack(const uint32_t sector)
|
|||
return track;
|
||||
}
|
||||
|
||||
bool CDROM_Interface_Image::ReadSector(Bit8u *buffer, bool raw, unsigned long sector)
|
||||
bool CDROM_Interface_Image::ReadSector(uint8_t *buffer, const bool raw, const uint32_t sector)
|
||||
{
|
||||
track_const_iter track = GetTrack(sector);
|
||||
|
||||
// Guard: Bail if the requested sector fell outside our tracks
|
||||
if (track == tracks.end() || track->file == nullptr) {
|
||||
#ifdef DEBUG
|
||||
LOG_MSG("CDROM: ReadSector at %lu => resulted "
|
||||
LOG_MSG("CDROM: ReadSector at %u => resulted "
|
||||
"in an invalid track or track->file",
|
||||
sector);
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
int seek = track->skip + (sector - track->start) * track->sectorSize;
|
||||
int length = (raw ? BYTES_PER_RAW_REDBOOK_FRAME : BYTES_PER_COOKED_REDBOOK_FRAME);
|
||||
uint32_t offset = track->skip + (sector - track->start) * track->sectorSize;
|
||||
const uint16_t length = (raw ? BYTES_PER_RAW_REDBOOK_FRAME : BYTES_PER_COOKED_REDBOOK_FRAME);
|
||||
if (track->sectorSize != BYTES_PER_RAW_REDBOOK_FRAME && raw) {
|
||||
return false;
|
||||
}
|
||||
if (track->sectorSize == BYTES_PER_RAW_REDBOOK_FRAME && !track->mode2 && !raw) seek += 16;
|
||||
if (track->mode2 && !raw) seek += 24;
|
||||
if (track->sectorSize == BYTES_PER_RAW_REDBOOK_FRAME && !track->mode2 && !raw)
|
||||
offset += 16;
|
||||
if (track->mode2 && !raw)
|
||||
offset += 24;
|
||||
|
||||
#if 0 // Excessively verbose.. only enable if needed
|
||||
#ifdef DEBUG
|
||||
|
@ -778,7 +774,7 @@ bool CDROM_Interface_Image::ReadSector(Bit8u *buffer, bool raw, unsigned long se
|
|||
length);
|
||||
#endif
|
||||
#endif
|
||||
return track->file->read(buffer, seek, length);
|
||||
return track->file->read(buffer, offset, length);
|
||||
}
|
||||
|
||||
|
||||
|
@ -786,7 +782,7 @@ void CDROM_Interface_Image::CDAudioCallBack(Bitu desired_track_frames)
|
|||
{
|
||||
/**
|
||||
* This callback runs in SDL's mixer thread, so there's a risk
|
||||
* our track_file pointer could be removed by the main thread.
|
||||
* our track_file pointer could be removed by the main thread.
|
||||
* We reserve the track_file up-front for the scope of this call.
|
||||
*/
|
||||
std::shared_ptr<TrackFile> track_file = player.trackFile.lock();
|
||||
|
@ -818,7 +814,8 @@ void CDROM_Interface_Image::CDAudioCallBack(Bitu desired_track_frames)
|
|||
return;
|
||||
}
|
||||
|
||||
const uint64_t decoded_track_frames = track_file->decode(player.buffer, desired_track_frames);
|
||||
const uint32_t decoded_track_frames = track_file->decode(player.buffer,
|
||||
static_cast<uint32_t>(desired_track_frames));
|
||||
player.playedTrackFrames += decoded_track_frames;
|
||||
|
||||
// uses either the stereo or mono and native or
|
||||
|
@ -828,7 +825,7 @@ void CDROM_Interface_Image::CDAudioCallBack(Bitu desired_track_frames)
|
|||
if (player.playedTrackFrames >= player.totalTrackFrames) {
|
||||
#ifdef DEBUG
|
||||
LOG_MSG("CDROM: CDAudioCallBack stopping because "
|
||||
"playedTrackFrames (%lu) >= totalTrackFrames (%lu)",
|
||||
"playedTrackFrames (%u) >= totalTrackFrames (%u)",
|
||||
player.playedTrackFrames, player.totalTrackFrames);
|
||||
#endif
|
||||
player.cd->StopAudio();
|
||||
|
@ -888,7 +885,12 @@ bool CDROM_Interface_Image::LoadIsoFile(char* filename)
|
|||
} else {
|
||||
return false;
|
||||
}
|
||||
track.length = track.file->getLength() / track.sectorSize;
|
||||
const int32_t track_bytes = track.file->getLength();
|
||||
if (track_bytes < 0)
|
||||
return false;
|
||||
|
||||
track.length = static_cast<uint32_t>(track_bytes) / track.sectorSize;
|
||||
|
||||
#ifdef DEBUG
|
||||
LOG_MSG("LoadIsoFile parsed %s => track 1, 0x40, sectorSize %d, mode2 is %s",
|
||||
filename,
|
||||
|
@ -906,7 +908,9 @@ bool CDROM_Interface_Image::LoadIsoFile(char* filename)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool CDROM_Interface_Image::CanReadPVD(TrackFile *file, int sectorSize, bool mode2)
|
||||
bool CDROM_Interface_Image::CanReadPVD(TrackFile *file,
|
||||
const uint16_t sectorSize,
|
||||
const bool mode2)
|
||||
{
|
||||
// Guard: Bail if our file pointer is empty
|
||||
if (file == nullptr) return false;
|
||||
|
@ -914,7 +918,7 @@ bool CDROM_Interface_Image::CanReadPVD(TrackFile *file, int sectorSize, bool mod
|
|||
// Initialize our array in the event file->read() doesn't fully write it
|
||||
Bit8u pvd[BYTES_PER_COOKED_REDBOOK_FRAME] = {0};
|
||||
|
||||
int seek = 16 * sectorSize; // first vd is located at sector 16
|
||||
uint32_t seek = 16 * sectorSize; // first vd is located at sector 16
|
||||
if (sectorSize == BYTES_PER_RAW_REDBOOK_FRAME && !mode2) seek += 16;
|
||||
if (mode2) seek += 24;
|
||||
file->read(pvd, seek, BYTES_PER_COOKED_REDBOOK_FRAME);
|
||||
|
@ -945,10 +949,10 @@ bool CDROM_Interface_Image::LoadCueSheet(char *cuefile)
|
|||
tracks.clear();
|
||||
|
||||
Track track;
|
||||
int shift = 0;
|
||||
int currPregap = 0;
|
||||
int totalPregap = 0;
|
||||
int prestart = -1;
|
||||
uint32_t shift = 0;
|
||||
uint32_t currPregap = 0;
|
||||
uint32_t totalPregap = 0;
|
||||
int32_t prestart = -1;
|
||||
int track_number;
|
||||
bool success;
|
||||
bool canAddTrack = false;
|
||||
|
@ -983,8 +987,8 @@ bool CDROM_Interface_Image::LoadCueSheet(char *cuefile)
|
|||
prestart = -1;
|
||||
|
||||
line >> track_number; // (cin) read into a true int first
|
||||
track.number = track_number; // then assign to the uint8_t
|
||||
string type;
|
||||
track.number = static_cast<uint8_t>(track_number);
|
||||
string type;
|
||||
GetCueKeyword(type, line);
|
||||
|
||||
if (type == "AUDIO") {
|
||||
|
@ -1014,11 +1018,11 @@ bool CDROM_Interface_Image::LoadCueSheet(char *cuefile)
|
|||
else if (command == "INDEX") {
|
||||
int index;
|
||||
line >> index;
|
||||
int frame;
|
||||
uint32_t frame;
|
||||
success = GetCueFrame(frame, line);
|
||||
|
||||
if (index == 1) track.start = frame;
|
||||
else if (index == 0) prestart = frame;
|
||||
else if (index == 0) prestart = static_cast<int32_t>(frame);
|
||||
// ignore other indices
|
||||
}
|
||||
else if (command == "FILE") {
|
||||
|
@ -1081,10 +1085,13 @@ bool CDROM_Interface_Image::LoadCueSheet(char *cuefile)
|
|||
|
||||
|
||||
|
||||
bool CDROM_Interface_Image::AddTrack(Track &curr, int &shift, const int prestart,
|
||||
int &totalPregap, const int currPregap)
|
||||
bool CDROM_Interface_Image::AddTrack(Track &curr,
|
||||
uint32_t &shift,
|
||||
const int32_t prestart,
|
||||
uint32_t &totalPregap,
|
||||
uint32_t currPregap)
|
||||
{
|
||||
int skip = 0;
|
||||
uint32_t skip = 0;
|
||||
|
||||
// frames between index 0(prestart) and 1(curr.start) must be skipped
|
||||
if (prestart >= 0) {
|
||||
|
@ -1093,7 +1100,7 @@ bool CDROM_Interface_Image::AddTrack(Track &curr, int &shift, const int prestart
|
|||
prestart, curr.start);
|
||||
return false;
|
||||
}
|
||||
skip = curr.start - prestart;
|
||||
skip = static_cast<uint32_t>(static_cast<int>(curr.start) - prestart);
|
||||
}
|
||||
|
||||
// Add the first track, if our vector is empty
|
||||
|
@ -1121,9 +1128,11 @@ bool CDROM_Interface_Image::AddTrack(Track &curr, int &shift, const int prestart
|
|||
curr.start += totalPregap;
|
||||
// current track uses a different file as the previous track
|
||||
} else {
|
||||
const int tmp = prev.file->getLength() - prev.skip;
|
||||
const uint32_t tmp = static_cast<uint32_t>
|
||||
(prev.file->getLength()) - prev.skip;
|
||||
prev.length = tmp / prev.sectorSize;
|
||||
if (tmp % prev.sectorSize != 0) prev.length++; // padding
|
||||
if (tmp % prev.sectorSize != 0)
|
||||
prev.length++; // padding
|
||||
|
||||
curr.start += prev.start + prev.length + currPregap;
|
||||
curr.skip = skip * curr.sectorSize;
|
||||
|
@ -1219,12 +1228,12 @@ bool CDROM_Interface_Image::GetCueKeyword(string &keyword, istream &in)
|
|||
{
|
||||
in >> keyword;
|
||||
for (Bitu i = 0; i < keyword.size(); i++) {
|
||||
keyword[i] = toupper(keyword[i]);
|
||||
keyword[i] = static_cast<char>(toupper(keyword[i]));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CDROM_Interface_Image::GetCueFrame(int &frames, istream &in)
|
||||
bool CDROM_Interface_Image::GetCueFrame(uint32_t &frames, istream &in)
|
||||
{
|
||||
std::string msf;
|
||||
in >> msf;
|
||||
|
|
|
@ -445,7 +445,10 @@ bool CMscdex::PlayAudioMSF(Bit8u subUnit, Bit32u start, Bit32u length) {
|
|||
Bit8u min = (Bit8u)(start>>16) & 0xFF;
|
||||
Bit8u sec = (Bit8u)(start>> 8) & 0xFF;
|
||||
Bit8u fr = (Bit8u)(start>> 0) & 0xFF;
|
||||
Bit32u sector = min*60*75+sec*75+fr - 150;
|
||||
Bit32u sector = min * 60 * REDBOOK_FRAMES_PER_SECOND
|
||||
+ sec * REDBOOK_FRAMES_PER_SECOND
|
||||
+ fr
|
||||
- REDBOOK_FRAME_PADDING;
|
||||
return dinfo[subUnit].lastResult = PlayAudioSector(subUnit,sector,length);
|
||||
}
|
||||
|
||||
|
@ -466,15 +469,17 @@ bool CMscdex::GetAudioStatus(Bit8u subUnit, bool& playing, bool& pause, TMSF& st
|
|||
if (dinfo[subUnit].lastResult) {
|
||||
if (playing) {
|
||||
// Start
|
||||
Bit32u addr = dinfo[subUnit].audioStart + 150;
|
||||
start.fr = (Bit8u)(addr%75); addr/=75;
|
||||
start.sec = (Bit8u)(addr%60);
|
||||
start.min = (Bit8u)(addr/60);
|
||||
Bit32u addr = dinfo[subUnit].audioStart + REDBOOK_FRAME_PADDING;
|
||||
start.fr = (Bit8u)(addr % REDBOOK_FRAMES_PER_SECOND);
|
||||
addr /= REDBOOK_FRAMES_PER_SECOND;
|
||||
start.sec = (Bit8u)(addr % 60);
|
||||
start.min = (Bit8u)(addr / 60);
|
||||
// End
|
||||
addr = dinfo[subUnit].audioEnd + 150;
|
||||
end.fr = (Bit8u)(addr%75); addr/=75;
|
||||
end.sec = (Bit8u)(addr%60);
|
||||
end.min = (Bit8u)(addr/60);
|
||||
addr = dinfo[subUnit].audioEnd + REDBOOK_FRAME_PADDING;
|
||||
end.fr = (Bit8u)(addr % REDBOOK_FRAMES_PER_SECOND);
|
||||
addr /= REDBOOK_FRAMES_PER_SECOND;
|
||||
end.sec = (Bit8u)(addr % 60);
|
||||
end.min = (Bit8u)(addr / 60);
|
||||
} else {
|
||||
memset(&start,0,sizeof(start));
|
||||
memset(&end,0,sizeof(end));
|
||||
|
@ -509,12 +514,15 @@ bool CMscdex::StopAudio(Bit8u subUnit) {
|
|||
if (dinfo[subUnit].audioPlay) {
|
||||
TMSF pos;
|
||||
GetCurrentPos(subUnit,pos);
|
||||
dinfo[subUnit].audioStart = pos.min*60*75+pos.sec*75+pos.fr - 150;
|
||||
dinfo[subUnit].audioStart = pos.min * 60 * REDBOOK_FRAMES_PER_SECOND
|
||||
+ pos.sec * REDBOOK_FRAMES_PER_SECOND
|
||||
+ pos.fr
|
||||
- REDBOOK_FRAME_PADDING;
|
||||
dinfo[subUnit].audioPaused = true;
|
||||
} else {
|
||||
dinfo[subUnit].audioPaused = false;
|
||||
dinfo[subUnit].audioStart = 0;
|
||||
dinfo[subUnit].audioEnd = 0;
|
||||
dinfo[subUnit].audioStart = 0;
|
||||
dinfo[subUnit].audioEnd = 0;
|
||||
}
|
||||
dinfo[subUnit].audioPlay = false;
|
||||
}
|
||||
|
@ -531,7 +539,10 @@ Bit32u CMscdex::GetVolumeSize(Bit8u subUnit) {
|
|||
Bit8u tr1,tr2; // <== place-holders (use lead-out for size calculation)
|
||||
TMSF leadOut;
|
||||
dinfo[subUnit].lastResult = GetCDInfo(subUnit,tr1,tr2,leadOut);
|
||||
if (dinfo[subUnit].lastResult) return (leadOut.min*60*75)+(leadOut.sec*75)+leadOut.fr;
|
||||
if (dinfo[subUnit].lastResult)
|
||||
return leadOut.min * 60 * REDBOOK_FRAMES_PER_SECOND
|
||||
+ leadOut.sec * REDBOOK_FRAMES_PER_SECOND
|
||||
+ leadOut.fr;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -614,7 +625,10 @@ bool CMscdex::ReadSectorsMSF(Bit8u subUnit, bool raw, Bit32u start, Bit16u num,
|
|||
Bit8u min = (Bit8u)(start>>16) & 0xFF;
|
||||
Bit8u sec = (Bit8u)(start>> 8) & 0xFF;
|
||||
Bit8u fr = (Bit8u)(start>> 0) & 0xFF;
|
||||
Bit32u sector = min*60*75+sec*75+fr - 150;
|
||||
Bit32u sector = min * 60 * REDBOOK_FRAMES_PER_SECOND
|
||||
+ sec * REDBOOK_FRAMES_PER_SECOND
|
||||
+ fr
|
||||
- REDBOOK_FRAME_PADDING;
|
||||
return ReadSectors(subUnit,raw,sector,num,data);
|
||||
}
|
||||
|
||||
|
@ -868,10 +882,10 @@ static Bit16u MSCDEX_IOCTL_Input(PhysPt buffer,Bit8u drive_unit) {
|
|||
Bit8u addr_mode = mem_readb(buffer+1);
|
||||
if (addr_mode == 0) { // HSG
|
||||
Bit32u frames = static_cast<Bit32u>(msf_to_frames(pos));
|
||||
if (frames < 150)
|
||||
if (frames < REDBOOK_FRAME_PADDING)
|
||||
MSCDEX_LOG("MSCDEX: Get position: invalid position %d:%d:%d", pos.min, pos.sec, pos.fr);
|
||||
else
|
||||
frames -= 150;
|
||||
frames -= REDBOOK_FRAME_PADDING;
|
||||
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