bjarni@6268: /* $Id$ */ KUDr@6254: KUDr@6254: #include "../stdafx.h" KUDr@6254: #include "../openttd.h" KUDr@6254: #include "../sound.h" KUDr@6254: #include "../string.h" KUDr@6254: #include "../variables.h" KUDr@6254: #include "../debug.h" KUDr@6254: #include "libtimidity.h" KUDr@6254: #include KUDr@6254: #include KUDr@6254: #include KUDr@6254: #include KUDr@6254: #include KUDr@6254: #include KUDr@6254: #include KUDr@6254: #include KUDr@6254: #if defined(PSP) KUDr@6254: #include KUDr@6254: #endif /* PSP */ KUDr@6254: KUDr@6254: enum MidiState { KUDr@6254: MIDI_STOPPED = 0, KUDr@6254: MIDI_PLAYING = 1, KUDr@6254: }; KUDr@6254: KUDr@6254: static struct { KUDr@6254: MidIStream *stream; KUDr@6254: MidSongOptions options; KUDr@6254: MidSong *song; KUDr@6254: KUDr@6254: MidiState status; KUDr@6254: uint32 song_length; KUDr@6254: uint32 song_position; KUDr@6254: } _midi; KUDr@6254: KUDr@6254: #if defined(PSP) KUDr@6254: static void AudioOutCallback(void *buf, unsigned int _reqn, void *userdata) KUDr@6254: { KUDr@6254: memset(buf, 0, _reqn * PSP_NUM_AUDIO_CHANNELS); KUDr@6254: if (_midi.status == MIDI_PLAYING) { KUDr@6254: mid_song_read_wave(_midi.song, buf, _reqn * PSP_NUM_AUDIO_CHANNELS); KUDr@6254: } KUDr@6254: } KUDr@6254: #endif /* PSP */ KUDr@6254: KUDr@6254: static const char *LibtimidityMidiStart(const char *const *param) KUDr@6254: { KUDr@6254: _midi.status = MIDI_STOPPED; KUDr@6254: KUDr@6254: if (mid_init(param == NULL ? NULL : (char *)param[0]) < 0) { KUDr@6254: /* If init fails, it can be because no configuration was found. KUDr@6254: * If it was not forced via param, try to load it without a KUDr@6254: * configuration. Who knows that works. */ KUDr@6254: if (param != NULL || mid_init_no_config() < 0) { KUDr@6254: DEBUG(driver, 0, "error initializing timidity"); KUDr@6254: return NULL; KUDr@6254: } KUDr@6254: } KUDr@6254: DEBUG(driver, 1, "successfully initialised timidity"); KUDr@6254: KUDr@6254: _midi.options.rate = 44100; KUDr@6254: _midi.options.format = MID_AUDIO_S16LSB; KUDr@6254: _midi.options.channels = 2; KUDr@6254: #if defined(PSP) KUDr@6254: _midi.options.buffer_size = PSP_NUM_AUDIO_SAMPLES; KUDr@6254: #else KUDr@6254: _midi.options.buffer_size = _midi.options.rate; KUDr@6254: #endif KUDr@6254: KUDr@6254: #if defined(PSP) KUDr@6254: pspAudioInit(); KUDr@6254: pspAudioSetChannelCallback(_midi.options.channels, &AudioOutCallback, NULL); KUDr@6254: pspAudioSetVolume(_midi.options.channels, PSP_VOLUME_MAX, PSP_VOLUME_MAX); KUDr@6254: #endif /* PSP */ KUDr@6254: KUDr@6254: return NULL; KUDr@6254: } KUDr@6254: bjarni@6298: static void LibtimidityMidiStop() KUDr@6254: { KUDr@6254: if (_midi.status == MIDI_PLAYING) { KUDr@6254: _midi.status = MIDI_STOPPED; KUDr@6254: mid_song_free(_midi.song); KUDr@6254: } KUDr@6254: mid_exit(); KUDr@6254: } KUDr@6254: KUDr@6254: static void LibtimidityMidiPlaySong(const char *filename) KUDr@6254: { KUDr@6254: _midi.stream = mid_istream_open_file(filename); KUDr@6254: if (_midi.stream == NULL) { KUDr@6254: DEBUG(driver, 0, "Could not open music file"); KUDr@6254: return; KUDr@6254: } KUDr@6254: KUDr@6254: _midi.song = mid_song_load(_midi.stream, &_midi.options); KUDr@6254: mid_istream_close(_midi.stream); KUDr@6254: _midi.song_length = mid_song_get_total_time(_midi.song); KUDr@6254: KUDr@6254: if (_midi.song == NULL) { KUDr@6254: DEBUG(driver, 1, "Invalid MIDI file"); KUDr@6254: return; KUDr@6254: } KUDr@6254: KUDr@6254: mid_song_start(_midi.song); KUDr@6254: _midi.status = MIDI_PLAYING; KUDr@6254: } KUDr@6254: bjarni@6298: static void LibtimidityMidiStopSong() KUDr@6254: { KUDr@6254: _midi.status = MIDI_STOPPED; KUDr@6254: mid_song_free(_midi.song); KUDr@6254: } KUDr@6254: bjarni@6298: static bool LibtimidityMidiIsPlaying() KUDr@6254: { KUDr@6254: if (_midi.status == MIDI_PLAYING) { KUDr@6254: _midi.song_position = mid_song_get_time(_midi.song); KUDr@6254: if (_midi.song_position >= _midi.song_length) { KUDr@6254: _midi.status = MIDI_STOPPED; KUDr@6254: _midi.song_position = 0; KUDr@6254: } KUDr@6254: } KUDr@6254: KUDr@6254: return (_midi.status == MIDI_PLAYING); KUDr@6254: } KUDr@6254: KUDr@6254: static void LibtimidityMidiSetVolume(byte vol) KUDr@6254: { KUDr@6254: if (_midi.song != NULL) KUDr@6254: mid_song_set_volume(_midi.song, vol); KUDr@6254: } KUDr@6254: KUDr@6254: const HalMusicDriver _libtimidity_music_driver = { KUDr@6254: LibtimidityMidiStart, KUDr@6254: LibtimidityMidiStop, KUDr@6254: LibtimidityMidiPlaySong, KUDr@6254: LibtimidityMidiStopSong, KUDr@6254: LibtimidityMidiIsPlaying, KUDr@6254: LibtimidityMidiSetVolume, KUDr@6254: }; KUDr@6254: