diff options
| author | Chris Apers | 2004-05-25 13:01:08 +0000 | 
|---|---|---|
| committer | Chris Apers | 2004-05-25 13:01:08 +0000 | 
| commit | 290ddb6f78b31291f3c14304b85870c1072c213b (patch) | |
| tree | cb7e79ae30841e1edc998511c89a425b422b3a35 /backends/PalmOS/Src/cd_msa.cpp | |
| parent | 8e2d5ad56f5fe2faa3c3abd74e89607b7a4ad8e0 (diff) | |
| download | scummvm-rg350-290ddb6f78b31291f3c14304b85870c1072c213b.tar.gz scummvm-rg350-290ddb6f78b31291f3c14304b85870c1072c213b.tar.bz2 scummvm-rg350-290ddb6f78b31291f3c14304b85870c1072c213b.zip | |
Revamped MSA CD player, now time is based on Sound Unit (SU). More compatible
svn-id: r13857
Diffstat (limited to 'backends/PalmOS/Src/cd_msa.cpp')
| -rw-r--r-- | backends/PalmOS/Src/cd_msa.cpp | 220 | 
1 files changed, 80 insertions, 140 deletions
| diff --git a/backends/PalmOS/Src/cd_msa.cpp b/backends/PalmOS/Src/cd_msa.cpp index 09b6d2eb5d..8879ce8cf1 100644 --- a/backends/PalmOS/Src/cd_msa.cpp +++ b/backends/PalmOS/Src/cd_msa.cpp @@ -21,14 +21,24 @@   */  #include <SonyClie.h>  #include "stdafx.h" -#include "scumm.h"  #include "common/system.h"  #include "cd_msa.h" -#include "start.h"	// for appFileCreator +#include "start.h"	// for appFileCreat + +static void doErr(Err e, const Char *msg) { +	Char err[100]; +	StrPrintF(err, "%ld : " , e); +	StrCat(err,msg); +	FrmCustomAlert(1000,err,0,0); +}  MsaCDPlayer::MsaCDPlayer(OSystem *sys) {  	_sys = sys;  	_msaRefNum = sysInvalidRefNum; + +	_msaLoops = 0; +	_msaStopTime = 0; +	_msaTrackEndSu = 0;  }  bool MsaCDPlayer::init() { @@ -42,37 +52,23 @@ bool MsaCDPlayer::init() {  				if (error == sysErrLibNotFound)  					error = SysLibLoad(sonySysFileTMsaLib, sonySysFileCMsaLib, &_msaRefNum); +			// FIXME : still don't understand how this lib works, it seems to be very unstable +			// and with the very bad documentation provided by Sony it's difficult to find out why +			// this doesn't work the same way on build-in MP3 device and external MP3 devices  			if (!error) { -//				Char buf[100]; -//				StrPrintF(buf,"MSA refNum %ld, Try to open lib ...", refNum); -//				FrmCustomAlert(1000,buf,0,0); -				MsaLibClose(_msaRefNum, msaLibOpenModeAlbum);	// close the lib if we previously let it open (?) Need to add Notify for sonySysNotifyMsaEnforceOpenEvent just in case ... +				//MsaLibClose(_msaRefNum, msaLibOpenModeAlbum);	// close the lib if we previously let it open (?) Need to add Notify for sonySysNotifyMsaEnforceOpenEvent just in case ...  				error = MsaLibOpen(_msaRefNum, msaLibOpenModeAlbum);			 -/*				switch (error) { -				case msaErrAlreadyOpen: -					FrmCustomAlert(1000,"msaErrAlreadyOpen",0,0); -					break; -				case msaErrMemory: -					FrmCustomAlert(1000,"msaErrMemory",0,0); -					break; -				case msaErrDifferentMode: -					FrmCustomAlert(1000,"msaErrDifferentMode",0,0); -					break; -				case expErrCardNotPresent: -					FrmCustomAlert(1000,"expErrCardNotPresent",0,0); -					break; -				} -*/ -				if (error == msaErrAlreadyOpen) -					error = MsaLibEnforceOpen(_msaRefNum, msaLibOpenModeAlbum, appFileCreator); + +				//if (error == msaErrAlreadyOpen) +				//	error = MsaLibEnforceOpen(_msaRefNum, msaLibOpenModeAlbum, appFileCreator); -				error = (error != msaErrStillOpen) ? error : errNone; +				//error = (error != msaErrStillOpen) ? error : errNone;  			}  		//}  	} -	if (error) -		_msaRefNum = sysInvalidRefNum; +//	if (error) +//		_msaRefNum = sysInvalidRefNum;  	_isInitialized = (_msaRefNum != sysInvalidRefNum);  	initInternal(); @@ -83,16 +79,10 @@ void MsaCDPlayer::initInternal() {  	if (!_isInitialized)  		return; -	// Beeeeeep !!! -//	MsaOutCapabilityType capability; -//	MsaOutInit(_msaRefNum); -//	MsaOutGetCapability(_msaRefNum, &capability); -//	MsaOutSetBeepLevel(_msaRefNum, capability.beepMaxLebel); -//	MsaOutStartBeep(_msaRefNum, 1000, msaOutBeepPatternOK); -  	Err e; -	UInt32 dummy, albumIterater = albumIteratorStart;  	Char nameP[256]; +	UInt32 dummy, albumIterater = albumIteratorStart; +  	MemSet(&_msaAlbum, sizeof(_msaAlbum), 0);  	_msaAlbum.maskflag = msa_INF_ALBUM;  	_msaAlbum.code = msa_LANG_CODE_ASCII; @@ -100,11 +90,7 @@ void MsaCDPlayer::initInternal() {  	_msaAlbum.fileNameLength = 256;  	e = MsaAlbumEnumerate(_msaRefNum, &albumIterater, &_msaAlbum); -//	if (e) doErr(e, "MsaAlbumEnumerate");  	e = MsaSetAlbum(_msaRefNum, _msaAlbum.albumRefNum, &dummy); -//	if (e) doErr(e, "MsaSetAlbum"); -//	e = MsaGetPBRate(_msaRefNum, &_msaPBRate); -//	if (e) doErr(e, "MsaGetPBRate");  	// TODO : use RMC to control volume  	// move this to setSolume @@ -130,68 +116,60 @@ bool MsaCDPlayer::poll() {  	MsaPBStatus pb;  	MsaGetPBStatus(_msaRefNum, &pb); -	return (_msaLoops != 0 && (_sys->get_msecs() < _msaEndTime || pb.status != msa_STOPSTATUS)); +	return (_msaLoops != 0 && (pb.currentSU < _msaTrackEndSu || pb.status != msa_STOPSTATUS));  }  void MsaCDPlayer::update() {  	if (!_isInitialized)  		return; +	// get playback status +	MsaPBStatus pb; +	MsaGetPBStatus(_msaRefNum, &pb); +  	// stop replay upon request of stop_cdrom()  	if (_msaStopTime != 0 && _sys->get_msecs() >= _msaStopTime) {  		MsaStop(_msaRefNum, true);  		_msaLoops = 0;  		_msaStopTime = 0; -		_msaEndTime = 0; +		_msaTrackEndSu = 0;  		return;  	} -	// not fully played -	if (_sys->get_msecs() < _msaEndTime) -		return; +	// not fully played nad still playing the correct track +	// (when playing a full track the return SU is not correct +	// and so we need to check if we are still playing the correct track) +	if (pb.currentSU < _msaTrackEndSu) { +		UInt16 trackNo; +		MsaPBListIndexToTrackNo(_msaRefNum, pb.currentpblistindex, &trackNo); +		if (trackNo == _msaTrack) +			return; +	} + +	MsaStop(_msaRefNum, true); -	if (_msaLoops == 0) { -		MsaStop(_msaRefNum, true); +	if (_msaLoops == 0)  		return; -	}  	// track ends and last play, force stop if still playing -	if (_msaLoops != 1) { -		MsaPBStatus pb; -		MsaGetPBStatus(_msaRefNum, &pb); -	 	if (pb.status != msa_STOPSTATUS) { -//			debug(0,"Stop It now"); -			MsaStop(_msaRefNum, true); -			return; -		} +/*	if (_msaLoops != 1 && pb.status != msa_STOPSTATUS) { +		MsaStop(_msaRefNum, true); +		return;  	} - +*/  	// loop again ? -	if (_msaLoops > 0) { -		MsaStop(_msaRefNum, true); // stop if loop=0 +	if (_msaLoops > 0)  		_msaLoops--; -	}  	// loop if needed  	if (_msaLoops != 0) { -		MsaStop(_msaRefNum, true); -//		debug(0,"Next loop : %d", _msaLoops); - -		_msaEndTime = _sys->get_msecs() + _msaTrackLength; -		if (_msaStartFrame == 0 && _msaEndFrame == 0) +		if (_msaStartFrame == 0 && _msaDuration == 0)  			MsaPlay(_msaRefNum, _msaTrack, 0, msa_PBRATE_SP);  		else -			MsaPlay(_msaRefNum, _msaTrack, _msaTrackStart, msa_PBRATE_SP); +			MsaPlay(_msaRefNum, _msaTrack, _msaTrackStartSu, msa_PBRATE_SP);  	}  } -static void doErr(Err e, const Char *msg) { -	Char err[100]; -	StrPrintF(err, "%ld : " , e); -	StrCat(err,msg); -	FrmCustomAlert(1000,err,0,0); -} -  void MsaCDPlayer::stop() {	/* Stop CD Audio in 1/10th of a second */  	if (!_isInitialized)  		return; @@ -201,24 +179,6 @@ void MsaCDPlayer::stop() {	/* Stop CD Audio in 1/10th of a second */  	return;  } -// frames are 1/75 sec -#define CD_FPS 75 -#define TO_MSECS(frame)	((UInt32)((frame) * 1000 / CD_FPS)) -// consider frame at 1/1000 sec -#define TO_SEC(msecs)	((UInt16)((msecs) / 1000)) -#define TO_MIN(msecs)	((UInt16)(TO_SEC((msecs)) / 60)) -#define FROM_MIN(mins)	((UInt32)((mins) * 60 * 1000)) -#define FROM_SEC(secs)	((UInt32)((secs) * 1000)) - -#define FRAMES_TO_MSF(f, M,S,F) {                                       \ -        int value = f;                                                  \ -        *(F) = value%CD_FPS;                                            \ -        value /= CD_FPS;                                                \ -        *(S) = value%60;                                                \ -        value /= 60;                                                    \ -        *(M) = value;                                                   \ -} -  void MsaCDPlayer::play(int track, int num_loops, int start_frame, int duration) {  	if (!_isInitialized)  		return; @@ -226,87 +186,67 @@ void MsaCDPlayer::play(int track, int num_loops, int start_frame, int duration)  	if (!num_loops && !start_frame)  		return; -	Err e; -	 -/* -	if (start_frame > 0) -		start_frame += CD_FPS >> 1; -*/ -	if (duration > 0) -		duration += 5; - -//	debug(0, ">> Request : track %d / loops : %d / start : %d / duration : %d", track, num_loops, start_frame, duration); -	 +	_msaTrack = track + gVars->CD.firstTrack - 1;	// first track >= 1 ?, not 0 (0=album)  	_msaLoops = num_loops; -	_msaTrack = track + gVars->music.firstTrack - 1;	// first track >= 1 ?, not 0 (0=album)  	_msaStartFrame = TO_MSECS(start_frame); -	_msaEndFrame = TO_MSECS(duration); - -//	debug(0, ">> To MSECS : start : %d / duration : %d", _msaStartFrame, _msaEndFrame); +	_msaDuration = TO_MSECS(duration); -	// if gVars->MP3 audio track -//	Err e; +	Err e;	  	MemHandle trackH;  	// stop current play if any  	MsaStop(_msaRefNum, true); +	_msaStopTime = 0; +  	// retreive track infos  	e = MsaGetTrackInfo(_msaRefNum, _msaTrack, 0, msa_LANG_CODE_ASCII, &trackH); -//	if (e) doErr(e, "MsaGetTrackInfo"); +  	// track exists  	if (!e && trackH) { -		MsaTime tTime; +		MsaTime msaTime; +		MsaTrackInfo *trackP;  		UInt32 SU, fullLength; -		MsaTrackInfo *tiP; -		// FIXME : this enable MsaSuToTime to return the right value +		// FIXME (?) : this enable MsaSuToTime to return the right value in some cases  		MsaPlay(_msaRefNum, _msaTrack, 0, msa_PBRATE_SP);  		MsaStop(_msaRefNum, true); -		tiP = (MsaTrackInfo *)MemHandleLock(trackH);	 -		MsaSuToTime(_msaRefNum, tiP->totalsu, &tTime); -		SU = tiP->totalsu; -		MemPtrUnlock(tiP); +		// get the msa time  +		trackP = (MsaTrackInfo *)MemHandleLock(trackH);	 +		MsaSuToTime(_msaRefNum, trackP->totalsu, &msaTime); +		SU = trackP->totalsu; +		MemPtrUnlock(trackP);  		MemHandleFree(trackH); -//		debug(0, ">> SU of track : %d (%d%:%d.%d)", SU, tTime.minute, tTime.second, tTime.frame); +		// MSA frame in milli-seconds  +		fullLength  = FROM_MIN(msaTime.minute); +		fullLength += FROM_SEC(msaTime.second); +		fullLength += msaTime.frame; -//		Char buf[200]; -//		StrPrintF(buf,"Track : %ld - %ld%:%ld.%ld (%ld)", track, tTime.minute, tTime.second, tTime.frame, SU); -//		FrmCustomAlert(1000,buf,0,0); - -		_msaStopTime = 0; -		fullLength = FROM_MIN(tTime.minute) + FROM_SEC(tTime.second) + tTime.frame; - -//		debug(0, ">> Full length : %d", fullLength); -		 -		if (_msaEndFrame > 0) { -			_msaTrackLength = _msaEndFrame; +		if (_msaDuration > 0) { +			_msaTrackLength = _msaDuration;  		} else if (_msaStartFrame > 0) {  			_msaTrackLength = fullLength;  			_msaTrackLength -= _msaStartFrame;  		} else {  			_msaTrackLength = fullLength;  		} -		 +				  		// try to play the track  		if (start_frame == 0 && duration == 0) {  			MsaPlay(_msaRefNum, _msaTrack, 0, msa_PBRATE_SP); +			_msaTrackEndSu = SU;  		} else {  			// FIXME : MsaTimeToSu doesn't work ... (may work with previous FIXME) -			_msaTrackStart = (UInt32) ((float)(_msaStartFrame) / ((float)fullLength / (float)SU)); -//			debug(0, ">> start at (float) : %d", _msaTrackStart); -/* -UInt32 f; -			FRAMES_TO_MSF(start_frame, &tTime.minute, &tTime.second, &f) -			tTime.frame = 0; -			MsaTimeToSu(_msaRefNum, &tTime, &SU); -			debug(0, ">> start at (MsaTimeToSu) : %d", SU); -*/ -			MsaPlay(_msaRefNum, _msaTrack, _msaTrackStart, msa_PBRATE_SP); -		} +			_msaTrackStartSu = (UInt32) ((float)(_msaStartFrame)  / ((float)fullLength / (float)SU)); +			_msaTrackEndSu	 = (UInt32) ((float)(_msaTrackLength) / ((float)fullLength / (float)SU)); +			_msaTrackEndSu	+= _msaTrackStartSu; +			 +			if (_msaTrackEndSu > SU) +				_msaTrackEndSu = SU; -		_msaEndTime = _sys->get_msecs() + _msaTrackLength; -//		debug(0, ">> track length : %d / end : %d", _msaTrackLength, _msaEndTime); +			MsaPlay(_msaRefNum, _msaTrack, _msaTrackStartSu, msa_PBRATE_SP); +		}  	} +	// TODO : use default track length if track not found  } | 
