// // Poll // // Poll the cd audio (used for proceeding to next track automatically) // void Poll() { if (initialized && driver) { U32 status; // Time to search if (search && (pollTime <= AIL_ms_count())) { // Read the status (this can be slow on some drives) switch (status = AIL_redbook_status(driver)) { // Still playing a track case REDBOOK_PLAYING: { U32 curTrack, curPos, end; // Get current info curTrack = AIL_redbook_track(driver); curPos = AIL_redbook_position(driver); // Some systems will briefly report playing the NEXT track! if ((curTrack == track) && track && curPos) { // Get track info AIL_redbook_track_info(driver, track, NULL, &end); // Recalc the scan time pollTime = AIL_ms_count() + (end - curPos) + POLL_ERROR; } break; } // Finished playing track case REDBOOK_STOPPED: Play(track + 1); break; default : Stop(); break; } } } }
// // Play // // Play a redbook track (request is wrapped, so returns track number started) // U32 Play(U32 newTrack) { if (initialized && driver) { // Get number of tracks on disc U32 count = AIL_redbook_tracks(driver); // Clip track into acceptable range if ((newTrack > count) || (newTrack < minTrack)) { newTrack = minTrack; } // If we ended up with a valid track number, start it playing if (newTrack >= 1 && newTrack <= count) { U32 start, end; // Get track info AIL_redbook_track_info(driver, newTrack, &start, &end); // Start it playing AIL_redbook_play(driver, start, end); // Update our track count track = newTrack; // Set next scan to be just past when this track ends pollTime = AIL_ms_count() + (end - start) + POLL_ERROR; // We're rockin, so turn on track searching search = TRUE; } else { // Probably a data cd search = FALSE; // Stop cd playing Stop(); } } return (track); }
void SoundManager::StartMusic(const sint32 &InTrackNum) { m_stopRedbookTemporarily = FALSE; if (!g_theProfileDB->IsUseRedbookAudio() || !c3files_HasCD()) return; if (m_noSound) return; if (m_usePlaySound) return; if (m_curTrack == -1) return; #if defined(USE_SDL) if (!m_cdrom) { return; } CDstatus status = SDL_CDStatus(m_cdrom); if ((CD_ERROR == status) || (!CD_INDRIVE(status))) { return; } sint32 const numTracks = m_cdrom->numtracks; #else if (!m_redbook) { return; } U32 status = AIL_redbook_status(m_redbook); if (status == REDBOOK_ERROR) { return; } if (AIL_redbook_track(m_redbook)) { AIL_redbook_stop(m_redbook); } sint32 const numTracks = AIL_redbook_tracks(m_redbook); #endif if (numTracks <= s_startTrack) return; m_numTracks = numTracks; sint32 trackNum = InTrackNum; if (trackNum < 0) trackNum = 0; if (trackNum > m_numTracks) trackNum = m_numTracks; m_curTrack = trackNum; #if defined(USE_SDL) SDL_CDPlayTracks(m_cdrom, trackNum, 0, 1, 0); #else U32 start; U32 end; AIL_redbook_track_info(m_redbook, trackNum, &start, &end); // Why? TerminateAllSounds(); AIL_redbook_play(m_redbook, start, end); #endif }