aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine/ksound.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/engine/ksound.cpp')
-rw-r--r--engines/sci/engine/ksound.cpp168
1 files changed, 94 insertions, 74 deletions
diff --git a/engines/sci/engine/ksound.cpp b/engines/sci/engine/ksound.cpp
index fa64ab4086..ef02f8ee21 100644
--- a/engines/sci/engine/ksound.cpp
+++ b/engines/sci/engine/ksound.cpp
@@ -154,7 +154,7 @@ void process_sound_events(EngineState *s) { /* Get all sound events, apply their
SongHandle handle;
int cue;
- if (s->_version >= SCI_VERSION_01)
+ if (s->_version >= SCI_VERSION_01_EGA)
return;
/* SCI01 and later explicitly poll for everything */
@@ -194,7 +194,7 @@ void process_sound_events(EngineState *s) { /* Get all sound events, apply their
break;
default:
- sciprintf("Unexpected result from sfx_poll: %d\n", result);
+ warning("Unexpected result from sfx_poll: %d", result);
break;
}
}
@@ -215,63 +215,63 @@ reg_t kDoSound_SCI0(EngineState *s, int funct_nr, int argc, reg_t *argv) {
debugC(2, kDebugLevelSound, "Command 0x%x", command);
switch (command) {
case 0:
- sciprintf("[InitObj]");
+ debugC(2, kDebugLevelSound, "[InitObj]");
break;
case 1:
- sciprintf("[Play]");
+ debugC(2, kDebugLevelSound, "[Play]");
break;
case 2:
- sciprintf("[NOP]");
+ debugC(2, kDebugLevelSound, "[NOP]");
break;
case 3:
- sciprintf("[DisposeHandle]");
+ debugC(2, kDebugLevelSound, "[DisposeHandle]");
break;
case 4:
- sciprintf("[SetSoundOn(?)]");
+ debugC(2, kDebugLevelSound, "[SetSoundOn(?)]");
break;
case 5:
- sciprintf("[Stop]");
+ debugC(2, kDebugLevelSound, "[Stop]");
break;
case 6:
- sciprintf("[Suspend]");
+ debugC(2, kDebugLevelSound, "[Suspend]");
break;
case 7:
- sciprintf("[Resume]");
+ debugC(2, kDebugLevelSound, "[Resume]");
break;
case 8:
- sciprintf("[Get(Set?)Volume]");
+ debugC(2, kDebugLevelSound, "[Get(Set?)Volume]");
break;
case 9:
- sciprintf("[Signal: Obj changed]");
+ debugC(2, kDebugLevelSound, "[Signal: Obj changed]");
break;
case 10:
- sciprintf("[Fade(?)]");
+ debugC(2, kDebugLevelSound, "[Fade(?)]");
break;
case 11:
- sciprintf("[ChkDriver]");
+ debugC(2, kDebugLevelSound, "[ChkDriver]");
break;
case 12:
- sciprintf("[PlayNextSong (formerly StopAll)]");
+ debugC(2, kDebugLevelSound, "[PlayNextSong (formerly StopAll)]");
break;
default:
- sciprintf("[unknown]");
+ debugC(2, kDebugLevelSound, "[unknown]");
break;
}
- sciprintf("(");
+ debugC(2, kDebugLevelSound, "(");
for (i = 1; i < argc; i++) {
- sciprintf("%04x:%04x", PRINT_REG(argv[i]));
+ debugC(2, kDebugLevelSound, "%04x:%04x", PRINT_REG(argv[i]));
if (i + 1 < argc)
- sciprintf(", ");
+ debugC(2, kDebugLevelSound, ", ");
}
- sciprintf(")\n");
+ debugC(2, kDebugLevelSound, ")\n");
#endif // DEBUG_SOUND
switch (command) {
case _K_SCI0_SOUND_INIT_HANDLE:
if (obj.segment) {
- sciprintf("Initializing song number %d\n", GET_SEL32V(obj, number));
+ debugC(2, kDebugLevelSound, "Initializing song number %d\n", GET_SEL32V(obj, number));
s->_sound.sfx_add_song(build_iterator(s, number, SCI_SONG_ITERATOR_TYPE_SCI0,
handle), 0, handle, number);
@@ -395,62 +395,62 @@ reg_t kDoSound_SCI01(EngineState *s, int funct_nr, int argc, reg_t *argv) {
debugC(2, kDebugLevelSound, "Command 0x%x", command);
switch (command) {
case 0:
- sciprintf("[MasterVolume]");
+ debugC(2, kDebugLevelSound, "[MasterVolume]");
break;
case 1:
- sciprintf("[Mute]");
+ debugC(2, kDebugLevelSound, "[Mute]");
break;
case 2:
- sciprintf("[NOP(2)]");
+ debugC(2, kDebugLevelSound, "[NOP(2)]");
break;
case 3:
- sciprintf("[GetPolyphony]");
+ debugC(2, kDebugLevelSound, "[GetPolyphony]");
break;
case 4:
- sciprintf("[Update]");
+ debugC(2, kDebugLevelSound, "[Update]");
break;
case 5:
- sciprintf("[Init]");
+ debugC(2, kDebugLevelSound, "[Init]");
break;
case 6:
- sciprintf("[Dispose]");
+ debugC(2, kDebugLevelSound, "[Dispose]");
break;
case 7:
- sciprintf("[Play]");
+ debugC(2, kDebugLevelSound, "[Play]");
break;
case 8:
- sciprintf("[Stop]");
+ debugC(2, kDebugLevelSound, "[Stop]");
break;
case 9:
- sciprintf("[Suspend]");
+ debugC(2, kDebugLevelSound, "[Suspend]");
break;
case 10:
- sciprintf("[Fade]");
+ debugC(2, kDebugLevelSound, "[Fade]");
break;
case 11:
- sciprintf("[UpdateCues]");
+ debugC(2, kDebugLevelSound, "[UpdateCues]");
break;
case 12:
- sciprintf("[MidiSend]");
+ debugC(2, kDebugLevelSound, "[MidiSend]");
break;
case 13:
- sciprintf("[Reverb]");
+ debugC(2, kDebugLevelSound, "[Reverb]");
break;
case 14:
- sciprintf("[Hold]");
+ debugC(2, kDebugLevelSound, "[Hold]");
break;
default:
- sciprintf("[unknown]");
+ debugC(2, kDebugLevelSound, "[unknown]");
break;
}
- sciprintf("(");
+ debugC(2, kDebugLevelSound, "(");
for (i = 1; i < argc; i++) {
- sciprintf("%04x:%04x", PRINT_REG(argv[i]));
+ debugC(2, kDebugLevelSound, "%04x:%04x", PRINT_REG(argv[i]));
if (i + 1 < argc)
- sciprintf(", ");
+ debugC(2, kDebugLevelSound, ", ");
}
- sciprintf(")\n");
+ debugC(2, kDebugLevelSound, ")\n");
}
#endif
@@ -504,7 +504,7 @@ reg_t kDoSound_SCI01(EngineState *s, int funct_nr, int argc, reg_t *argv) {
//int pri = GET_SEL32V(obj, pri);
if (obj.segment && (s->resmgr->testResource(ResourceId(kResourceTypeSound, number)))) {
- sciprintf("Initializing song number %d\n", number);
+ debugC(2, kDebugLevelSound, "Initializing song number %d\n", number);
s->_sound.sfx_add_song(build_iterator(s, number, SCI_SONG_ITERATOR_TYPE_SCI1,
handle), 0, handle, number);
PUT_SEL32(obj, nodePtr, obj);
@@ -685,80 +685,80 @@ reg_t kDoSound_SCI1(EngineState *s, int funct_nr, int argc, reg_t *argv) {
debugC(2, kDebugLevelSound, "Command 0x%x", command);
switch (command) {
case 0:
- sciprintf("[MasterVolume]");
+ debugC(2, kDebugLevelSound, "[MasterVolume]");
break;
case 1:
- sciprintf("[Mute]");
+ debugC(2, kDebugLevelSound, "[Mute]");
break;
case 2:
- sciprintf("[NOP(2)]");
+ debugC(2, kDebugLevelSound, "[NOP(2)]");
break;
case 3:
- sciprintf("[GetPolyphony]");
+ debugC(2, kDebugLevelSound, "[GetPolyphony]");
break;
case 4:
- sciprintf("[GetAudioCapability]");
+ debugC(2, kDebugLevelSound, "[GetAudioCapability]");
break;
case 5:
- sciprintf("[GlobalSuspend]");
+ debugC(2, kDebugLevelSound, "[GlobalSuspend]");
break;
case 6:
- sciprintf("[Init]");
+ debugC(2, kDebugLevelSound, "[Init]");
break;
case 7:
- sciprintf("[Dispose]");
+ debugC(2, kDebugLevelSound, "[Dispose]");
break;
case 8:
- sciprintf("[Play]");
+ debugC(2, kDebugLevelSound, "[Play]");
break;
case 9:
- sciprintf("[Stop]");
+ debugC(2, kDebugLevelSound, "[Stop]");
break;
case 10:
- sciprintf("[SuspendHandle]");
+ debugC(2, kDebugLevelSound, "[SuspendHandle]");
break;
case 11:
- sciprintf("[Fade]");
+ debugC(2, kDebugLevelSound, "[Fade]");
break;
case 12:
- sciprintf("[Hold]");
+ debugC(2, kDebugLevelSound, "[Hold]");
break;
case 13:
- sciprintf("[Unused(13)]");
+ debugC(2, kDebugLevelSound, "[Unused(13)]");
break;
case 14:
- sciprintf("[SetVolume]");
+ debugC(2, kDebugLevelSound, "[SetVolume]");
break;
case 15:
- sciprintf("[SetPriority]");
+ debugC(2, kDebugLevelSound, "[SetPriority]");
break;
case 16:
- sciprintf("[SetLoop]");
+ debugC(2, kDebugLevelSound, "[SetLoop]");
break;
case 17:
- sciprintf("[UpdateCues]");
+ debugC(2, kDebugLevelSound, "[UpdateCues]");
break;
case 18:
- sciprintf("[MidiSend]");
+ debugC(2, kDebugLevelSound, "[MidiSend]");
break;
case 19:
- sciprintf("[Reverb]");
+ debugC(2, kDebugLevelSound, "[Reverb]");
break;
case 20:
- sciprintf("[UpdateVolPri]");
+ debugC(2, kDebugLevelSound, "[UpdateVolPri]");
break;
default:
- sciprintf("[unknown]");
+ debugC(2, kDebugLevelSound, "[unknown]");
break;
}
- sciprintf("(");
+ debugC(2, kDebugLevelSound, "(");
for (i = 1; i < argc; i++) {
- sciprintf("%04x:%04x", PRINT_REG(argv[i]));
+ debugC(2, kDebugLevelSound, "%04x:%04x", PRINT_REG(argv[i]));
if (i + 1 < argc)
- sciprintf(", ");
+ debugC(2, kDebugLevelSound, ", ");
}
- sciprintf(")\n");
+ debugC(2, kDebugLevelSound, ")\n");
}
#endif // DEBUG_SOUND
@@ -807,12 +807,27 @@ reg_t kDoSound_SCI1(EngineState *s, int funct_nr, int argc, reg_t *argv) {
}
if (!GET_SEL32V(obj, nodePtr) && obj.segment) {
- if (!s->resmgr->testResource(ResourceId(kResourceTypeSound, number))) {
- sciprintf("Could not open song number %d\n", number);
- return NULL_REG;
+ // In SCI1.1 games, sound effects are started from here. If we can find
+ // a relevant audio resource, play it, otherwise switch to synthesized
+ // effects. If the resource exists, play it using map 65535 (sound
+ // effects map)
+ if (s->resmgr->testResource(ResourceId(kResourceTypeAudio, number)) &&
+ s->_version >= SCI_VERSION_1_1) {
+ // Found a relevant audio resource, play it
+ s->_sound.stopAudio();
+ PUT_SEL32V(obj, signal, s->_sound.startAudio(65535, number));
+ return s->r_acc;
+ } else {
+ if (!s->resmgr->testResource(ResourceId(kResourceTypeSound, number))) {
+ warning("Could not open song number %d", number);
+ // Send a "stop handle" event so that the engine won't wait forever here
+ s->_sound.sfx_song_set_status(handle, SOUND_STATUS_STOPPED);
+ PUT_SEL32V(obj, signal, -1);
+ return s->r_acc;
+ }
}
- sciprintf("Initializing song number %d\n", number);
+ debugC(2, kDebugLevelSound, "Initializing song number %d\n", number);
s->_sound.sfx_add_song(build_iterator(s, number, SCI_SONG_ITERATOR_TYPE_SCI1,
handle), 0, handle, number);
PUT_SEL32(obj, nodePtr, obj);
@@ -838,7 +853,7 @@ reg_t kDoSound_SCI1(EngineState *s, int funct_nr, int argc, reg_t *argv) {
}
if (obj.segment && (s->resmgr->testResource(ResourceId(kResourceTypeSound, number)))) {
- sciprintf("Initializing song number %d\n", number);
+ debugC(2, kDebugLevelSound, "Initializing song number %d\n", number);
s->_sound.sfx_add_song(build_iterator(s, number, SCI_SONG_ITERATOR_TYPE_SCI1,
handle), 0, handle, number);
PUT_SEL32(obj, nodePtr, obj);
@@ -963,6 +978,9 @@ reg_t kDoSound_SCI1(EngineState *s, int funct_nr, int argc, reg_t *argv) {
return s->r_acc;
}
+/**
+ * Used for synthesized music playback
+ */
reg_t kDoSound(EngineState *s, int funct_nr, int argc, reg_t *argv) {
if (s->_kernel->_selectorMap.setVol != -1)
return kDoSound_SCI1(s, funct_nr, argc, argv);
@@ -972,7 +990,9 @@ reg_t kDoSound(EngineState *s, int funct_nr, int argc, reg_t *argv) {
return kDoSound_SCI0(s, funct_nr, argc, argv);
}
-// Used for speech playback in CD games
+/**
+ * Used for speech playback and digital soundtracks in CD games
+ */
reg_t kDoAudio(EngineState *s, int funct_nr, int argc, reg_t *argv) {
Audio::Mixer *mixer = g_system->getMixer();