diff --git a/src/music/libtimidity.cpp b/src/music/libtimidity.cpp index 96534b6204..6377507d2e 100644 --- a/src/music/libtimidity.cpp +++ b/src/music/libtimidity.cpp @@ -62,7 +62,7 @@ void Android_MidiMixMusic(Sint16 *stream, int len) while( len > 0 ) { int minlen = min(sizeof(buf), len); - mid_song_read_wave(_midi.song, stream, min(sizeof(buf), len*2)); + mid_song_read_wave(_midi.song, buf, min(sizeof(buf), len*2)); for( Uint16 i = 0; i < minlen; i++ ) stream[i] += buf[i]; stream += minlen; @@ -79,6 +79,7 @@ const char *MusicDriver_LibTimidity::Start(const char * const *param) { _midi.status = MIDI_STOPPED; _midi.song = NULL; + volume = 99; // Avoid clipping if (mid_init(param == NULL ? NULL : const_cast(param[0])) < 0) { /* If init fails, it can be because no configuration was found. @@ -133,6 +134,7 @@ void MusicDriver_LibTimidity::PlaySong(const char *filename) return; } + mid_song_set_volume(_midi.song, volume); mid_song_start(_midi.song); _midi.status = MIDI_PLAYING; } @@ -160,5 +162,6 @@ bool MusicDriver_LibTimidity::IsSongPlaying() void MusicDriver_LibTimidity::SetVolume(byte vol) { + volume = vol * 99 / 127; // I'm not sure about that value if (_midi.song != NULL) mid_song_set_volume(_midi.song, vol); } diff --git a/src/music/libtimidity.h b/src/music/libtimidity.h index abe17e7703..0a0686499f 100644 --- a/src/music/libtimidity.h +++ b/src/music/libtimidity.h @@ -16,6 +16,7 @@ /** Music driver making use of libtimidity. */ class MusicDriver_LibTimidity : public MusicDriver { + int volume; public: /* virtual */ const char *Start(const char * const *param); diff --git a/src/music_gui.cpp b/src/music_gui.cpp index cf48cf2193..307ad0c6c7 100644 --- a/src/music_gui.cpp +++ b/src/music_gui.cpp @@ -689,7 +689,7 @@ struct MusicWindow : public Window { if (_current_text_dir == TD_RTL) new_vol = 127 - new_vol; if (new_vol != *vol) { *vol = new_vol; - if (widget == WID_M_MUSIC_VOL) MusicVolumeChanged(new_vol); + if (widget == WID_M_MUSIC_VOL) MusicVolumeChanged((new_vol * new_vol) / 127); // Kinda logarithmic scale this->SetDirty(); }