diff options
| author | Filippos Karapetis | 2009-11-29 14:48:15 +0000 | 
|---|---|---|
| committer | Filippos Karapetis | 2009-11-29 14:48:15 +0000 | 
| commit | 3cedd0f2b9d8df729ece264b8dfb39253a092937 (patch) | |
| tree | 2f848948920cd2c7f2fb8d55378ebbd2c039b9c6 | |
| parent | dc22fc1c9e7ad026990ed553ac368d1a125bf415 (diff) | |
| download | scummvm-rg350-3cedd0f2b9d8df729ece264b8dfb39253a092937.tar.gz scummvm-rg350-3cedd0f2b9d8df729ece264b8dfb39253a092937.tar.bz2 scummvm-rg350-3cedd0f2b9d8df729ece264b8dfb39253a092937.zip  | |
Started assigning the code from Greg's SCI engine to our sound commands - still WIP
svn-id: r46197
| -rw-r--r-- | engines/sci/sfx/soundcmd.cpp | 211 | 
1 files changed, 181 insertions, 30 deletions
diff --git a/engines/sci/sfx/soundcmd.cpp b/engines/sci/sfx/soundcmd.cpp index ec90d49c4e..4a42a2f457 100644 --- a/engines/sci/sfx/soundcmd.cpp +++ b/engines/sci/sfx/soundcmd.cpp @@ -131,10 +131,8 @@ SoundCommandParser::SoundCommandParser(ResourceManager *resMan, SegManager *segM  	_hasNodePtr = (((SciEngine*)g_engine)->getKernel()->_selectorCache.nodePtr != -1); -#ifndef USE_OLD_MUSIC_FUNCTIONS  	_music = new SciMusic();  	_music->init(); -#endif  	switch (doSoundVersion) {  	case SCI_VERSION_0_EARLY: @@ -351,6 +349,31 @@ void SoundCommandParser::cmdPlayHandle(reg_t obj, SongHandle handle, int value)  			PUT_SEL32V(_segMan, obj, signal, 0);  		}  	} + +#if 0 +	if (hobj == 0) +		return; +	Object obj(hobj); +	HEAPHANDLE hptr = obj.getProperty(44); +	if (hptr) { +		sciSound *pSnd = (sciSound *)heap2Ptr(hptr); +		if (pSnd->resnum != obj.getProperty(43)) { // another sound loaded into struct +			KillSnd(hobj); +			InitSnd(hobj); +		} +		ResMgr.ResLock(SCI_RES_SOUND, pSnd->resnum); +		obj.setProperty(93, 0x1234/*res->getHandle()*/); // handle +		obj.setProperty(17, 0);	// signal +		obj.setProperty(94, 0);	// min +		obj.setProperty(95, 0);	// sec +		obj.setProperty(96, 0);	// frame +		pSnd->loop = (obj.getProperty(6) == 0xFFFF ? 1 : 0);	// loop +		pSnd->prio = obj.getProperty(63);	// priority +		pSnd->volume = obj.getProperty(97);	// vol +		//ChangeSndState(hobj); +		_audio->soundPlay(pSnd); +	} +#endif  }  void SoundCommandParser::cmdDummy(reg_t obj, SongHandle handle, int value) { @@ -374,6 +397,22 @@ void SoundCommandParser::cmdDisposeHandle(reg_t obj, SongHandle handle, int valu  		if (!_hasNodePtr)  			PUT_SEL32V(_segMan, obj, handle, 0x0000);  	} + +#if 0 +	if (hobj == 0) +		return; +	Object obj(hobj); +	StopSnd(hobj); +	HEAPHANDLE hptr = obj.getProperty(44);	// nodePtr +	if (hptr) { +		sciSound *pSnd = (sciSound *)heap2Ptr(hptr); +		_audio->soundKill(pSnd); +		ResMgr.ResUnload(SCI_RES_SOUND, pSnd->resnum); +		_soundList->DeleteNode(hptr); +		heapDisposePtr(hptr); +	} +	obj.setProperty(44, 0);	// nodePtr +#endif  }  void SoundCommandParser::cmdStopHandle(reg_t obj, SongHandle handle, int value) { @@ -381,6 +420,20 @@ void SoundCommandParser::cmdStopHandle(reg_t obj, SongHandle handle, int value)  	if (_hasNodePtr)  		PUT_SEL32V(_segMan, obj, signal, SIGNAL_OFFSET); + +#if 0 +	if (hobj == 0) +		return; +	Object obj(hobj); +	obj.setProperty(93, 0);	// handle +	obj.setProperty(17, 0xFFFF);	// signal +	sciSound *pSnd = (sciSound *)heap2Ptr(obj.getProperty(44)); +	if (pSnd) { +		pSnd->dataInc = 0; +		pSnd->signal = 0xFFFF; +		_audio->soundStop(pSnd); +	} +#endif  }  void SoundCommandParser::cmdSuspendHandle(reg_t obj, SongHandle handle, int value) { @@ -388,6 +441,21 @@ void SoundCommandParser::cmdSuspendHandle(reg_t obj, SongHandle handle, int valu  		changeHandleStatus(obj, handle, SOUND_STATUS_SUSPENDED);  	else  		changeHandleStatus(obj, handle, value ? SOUND_STATUS_SUSPENDED : SOUND_STATUS_PLAYING); + +#if 0 +	// PauseSnd(argv[2], argv[3]); - PauseSnd(HEAPHANDLE hobj, uint16 w) +	if (hobj == 0) +		return; +	Object obj(hobj); +	HEAPHANDLE hnode = obj.getProperty(44);	// nodePtr +	if (!hnode) +		return; +	sciSound *pSnd = (sciSound *)heap2Ptr(hnode); +	if (w) +		_audio->soundPause(pSnd); +	else +		_audio->soundPlay(pSnd); +#endif  }  void SoundCommandParser::cmdResumeHandle(reg_t obj, SongHandle handle, int value) { @@ -395,6 +463,8 @@ void SoundCommandParser::cmdResumeHandle(reg_t obj, SongHandle handle, int value  }  void SoundCommandParser::cmdMuteSound(reg_t obj, SongHandle handle, int value) { +	//_acc = _music->SoundOn(argc > 1 ? argv[2] : 0xFF); +  	// TODO  	/* if there's a parameter, we're setting it.  Otherwise, we're querying it. */ @@ -407,10 +477,9 @@ void SoundCommandParser::cmdMuteSound(reg_t obj, SongHandle handle, int value) {  }  void SoundCommandParser::cmdVolume(reg_t obj, SongHandle handle, int value) { -	if (obj != SIGNAL_REG) -		_state->sfx_setVolume(obj.toSint16()); - -	_acc = make_reg(0, _state->sfx_getVolume()); +	if (_argc > 1) +		_music->soundSetMasterVolume(obj.toSint16()); +	_acc = make_reg(0, _music->soundGetMasterVolume());  }  void SoundCommandParser::cmdFadeHandle(reg_t obj, SongHandle handle, int value) { @@ -446,36 +515,43 @@ void SoundCommandParser::cmdFadeHandle(reg_t obj, SongHandle handle, int value)  			PUT_SEL32V(_segMan, obj, signal, SIGNAL_OFFSET);  		}  	} + +#if 0 +	// FadeSnd(argv[2], argv[3], argv[4], argv[5]); + +//void SciEngine::FadeSnd(HEAPHANDLE hobj, uint16 tVolume, uint16 tickerstep, int16 fadestep) { +	if (hobj == 0) +		return; +	Object obj(hobj); +	HEAPHANDLE hnode = obj.getProperty(44);	// nodePtr +	if (!hnode) +		return; +	sciSound *pSnd = (sciSound *)heap2Ptr(hnode); +	pSnd->FadeTo = tVolume; +	pSnd->FadeStep = pSnd->volume > tVolume ? -fadestep : fadestep; +	pSnd->FadeTickerStep = tickerstep * 16667 / _audio->soundGetTempo(); +	pSnd->FadeTicker = 0; +//} +#endif  }  void SoundCommandParser::cmdGetPolyphony(reg_t obj, SongHandle handle, int value) {  	_acc = make_reg(0, _state->sfx_get_player_polyphony()); -} - -void cmdGetPlayNext(EngineState *s, reg_t obj, SongHandle handle, int value) { -	// TODO -	// _state->sfx_all_stop(); +	// TODO: Amiga music +	//_acc = make_reg(0, _music->soundGetVoices());  }  void SoundCommandParser::cmdUpdateHandle(reg_t obj, SongHandle handle, int value) { -	// FIXME: Get these from the sound server -	int signal = 0; -	int min = 0; -	int sec = 0; -	int frame = 0; - -	// FIXME: Update the sound server state with 'vol' -	//int vol = GET_SEL32V(segMan, obj, vol); - -	_state->sfx_song_set_loops(handle, GET_SEL32V(_segMan, obj, loop)); -	_state->sfx_song_renice(handle, GET_SEL32V(_segMan, obj, pri)); - -	debugC(2, kDebugLevelSound, "[sound01-update-handle] -- CUE %04x:%04x", PRINT_REG(obj)); - -	PUT_SEL32V(_segMan, obj, signal, signal); -	PUT_SEL32V(_segMan, obj, min, min); -	PUT_SEL32V(_segMan, obj, sec, sec); -	PUT_SEL32V(_segMan, obj, frame, frame); +	if (!GET_SEL32(_segMan, obj, nodePtr).isNull()) { +		int16 loop = GET_SEL32V(_segMan, obj, loop); +		int16 vol = GET_SEL32V(_segMan, obj, vol); +		int16 priority = GET_SEL32V(_segMan, obj, priority); + +		// TODO: pSnd +		//pSnd->loop = (loop == 0xFFFF ? 1 : 0); +		//_music->soundSetVolume(pSnd, vol); +		//_music->soundSetPriority(pSnd, prio); +	}  }  void SoundCommandParser::cmdUpdateCues(reg_t obj, SongHandle handle, int value) { @@ -546,6 +622,35 @@ void SoundCommandParser::cmdUpdateCues(reg_t obj, SongHandle handle, int value)  		PUT_SEL32V(_segMan, obj, sec, sec);  		PUT_SEL32V(_segMan, obj, frame, frame);  	} + +#if 0 +	if (hobj == 0) +		return; +	Object obj(hobj); +	HEAPHANDLE hnode = obj.getProperty(44);	// nodePtr +	if (hnode) { +		sciSound *pSnd = (sciSound *)heap2Ptr(hnode); +		switch (pSnd->signal) { +		case 0: +			if (pSnd->dataInc != obj.getProperty(92)) { // dataInc +				obj.setProperty(92, pSnd->dataInc);	// dataInc +				obj.setProperty(17, pSnd->dataInc + 127); // signal +			} +			break; +		case 0xFFFF: +			StopSnd(hobj); +			break; +		default: +			obj.setProperty(17, pSnd->signal);	// signal +		} +		//D13E +		pSnd->signal = 0; +		obj.setProperty(94, pSnd->ticker / 3600); // .min +		obj.setProperty(95, pSnd->ticker % 3600 / 60); // .sec +		obj.setProperty(96, pSnd->ticker); // .frame +		obj.setProperty(97, pSnd->volume); // volume +	} +#endif  }  void SoundCommandParser::cmdSendMidi(reg_t obj, SongHandle handle, int value) { @@ -559,6 +664,7 @@ void SoundCommandParser::cmdReverb(reg_t obj, SongHandle handle, int value) {  }  void SoundCommandParser::cmdHoldHandle(reg_t obj, SongHandle handle, int value) {  	_state->sfx_song_set_hold(handle, value); +	// TODO  }  void SoundCommandParser::cmdGetAudioCapability(reg_t obj, SongHandle handle, int value) { @@ -571,17 +677,49 @@ void SoundCommandParser::cmdGetPlayNext(reg_t obj, SongHandle handle, int value)  void SoundCommandParser::cmdSetHandleVolume(reg_t obj, SongHandle handle, int value) {  	// TODO +#if 0 +	if (hobj == 0) +		return; +	Object obj(hobj); +	sciSound *pSnd; +	HEAPHANDLE hnode = obj.getProperty(44);	// nodePtr +	if (hnode && (pSnd = (sciSound *)heap2Ptr(hnode))) { +		if (pSnd->volume != w) { +			pSnd->volume = w; +			_audio->soundSetVolume(pSnd, w); +			obj.setProperty(97, w);	// volume +		} +	} +#endif  }  void SoundCommandParser::cmdSetHandlePriority(reg_t obj, SongHandle handle, int value) {  	script_set_priority(_resMan, _segMan, _state, obj, value); + +#if 0 +	if (hobj == 0) +		return; +	Object obj(hobj); +	sciSound *pSnd; +	HEAPHANDLE hnode = obj.getProperty(44);	// nodePtr +	if (hnode && (pSnd = (sciSound *)heap2Ptr(hnode))) { +		if (w == 0xFFFF) { +			//pSnd->prio=0;field_15B=0 +			obj.setProperty(102, obj.getProperty(102) & 0xFD);//flags +		} else { +			//pSnd->field_15B=1; +			obj.setProperty(102, obj.getProperty(102) | 2);//flags +			//DoSOund(0xF,hobj,w) +		} +	} +#endif  }  void SoundCommandParser::cmdSetHandleLoop(reg_t obj, SongHandle handle, int value) {  	if (!GET_SEL32(_segMan, obj, nodePtr).isNull()) {  		uint16 looping = (value == -1) ? 1 : 0xFFFF;  		_state->sfx_song_set_loops(handle, looping); -		PUT_SEL32V(_segMan, obj, loop, looping); +		PUT_SEL32V(_segMan, obj, loop, (value == -1) ? 0xFFFF : 1);  	}  } @@ -594,6 +732,19 @@ void SoundCommandParser::cmdUpdateVolumePriority(reg_t obj, SongHandle handle, i   		_state->sfx_song_set_loops(handle, GET_SEL32V(_segMan, obj, loop));   		script_set_priority(_resMan, _segMan, _state, obj, GET_SEL32V(_segMan, obj, pri));   	} + +#if 0 +	if (!GET_SEL32(_segMan, obj, nodePtr).isNull()) { +		int16 loop = GET_SEL32V(_segMan, obj, loop); +		int16 vol = GET_SEL32V(_segMan, obj, vol); +		int16 priority = GET_SEL32V(_segMan, obj, priority); + +		// TODO: pSnd +		//pSnd->loop = (loop == 0xFFFF ? 1 : 0); +		//_music->soundSetVolume(pSnd, vol); +		//_music->soundSetPriority(pSnd, prio); +	} +#endif  }  } // End of namespace Sci  | 
