diff --git a/src/emscripten-audio-stream.c b/src/emscripten-audio-stream.c index cc7a968..99809d0 100644 --- a/src/emscripten-audio-stream.c +++ b/src/emscripten-audio-stream.c @@ -210,21 +210,24 @@ SYMBOL_EXPORT unsigned int emscripten_get_available_audio_stream_fragments(ALLEG } SYMBOL_EXPORT double emscripten_get_audio_stream_length_sec(ALLEGRO_AUDIO_STREAM *stream) { - // FIXME EMSCRIPTEN_AUDIO_STREAM *s = (EMSCRIPTEN_AUDIO_STREAM*)stream; - return al_get_sample_instance_length(s->instance); + unsigned int samples_per_sec = al_get_sample_instance_frequency(s->instance); + return al_get_sample_instance_length(s->instance) / (double)samples_per_sec; } SYMBOL_EXPORT bool emscripten_seek_audio_stream_secs(ALLEGRO_AUDIO_STREAM *stream, double val) { - // FIXME EMSCRIPTEN_AUDIO_STREAM *s = (EMSCRIPTEN_AUDIO_STREAM*)stream; - return al_set_sample_instance_position(s->instance, val); + double length = emscripten_get_audio_stream_length_sec(stream); + unsigned int samples = emscripten_get_audio_stream_length(stream); + return al_set_sample_instance_position(s->instance, samples * (val / length)); } SYMBOL_EXPORT double emscripten_get_audio_stream_position_secs(ALLEGRO_AUDIO_STREAM *stream) { - // FIXME EMSCRIPTEN_AUDIO_STREAM *s = (EMSCRIPTEN_AUDIO_STREAM*)stream; - return al_get_sample_instance_position(s->instance); + double sample_pos = al_get_sample_instance_position(s->instance); + double length = emscripten_get_audio_stream_length_sec(stream); + unsigned int samples = emscripten_get_audio_stream_length(stream); + return length * (sample_pos / (double)samples); } SYMBOL_EXPORT void emscripten_destroy_audio_stream(ALLEGRO_AUDIO_STREAM *stream) { diff --git a/src/emscripten-audio-stream.h b/src/emscripten-audio-stream.h index 13012df..04b98d4 100644 --- a/src/emscripten-audio-stream.h +++ b/src/emscripten-audio-stream.h @@ -50,9 +50,9 @@ float emscripten_get_audio_stream_gain(ALLEGRO_AUDIO_STREAM *stream); float emscripten_get_audio_stream_pan(ALLEGRO_AUDIO_STREAM *stream); bool emscripten_set_audio_stream_speed(ALLEGRO_AUDIO_STREAM *stream, float val); bool emscripten_set_audio_stream_pan(ALLEGRO_AUDIO_STREAM *stream, float val); -double emscripten_get_audio_stream_length_sec(ALLEGRO_AUDIO_STREAM *stream) __attribute__((deprecated("not implemented yet for Emscripten"))); -bool emscripten_seek_audio_stream_secs(ALLEGRO_AUDIO_STREAM *stream, double val) __attribute__((deprecated("not implemented yet for Emscripten"))); -double emscripten_get_audio_stream_position_secs(ALLEGRO_AUDIO_STREAM *stream) __attribute__((deprecated("not implemented yet for Emscripten"))); +double emscripten_get_audio_stream_length_sec(ALLEGRO_AUDIO_STREAM *stream); +bool emscripten_seek_audio_stream_secs(ALLEGRO_AUDIO_STREAM *stream, double val); +double emscripten_get_audio_stream_position_secs(ALLEGRO_AUDIO_STREAM *stream); void emscripten_destroy_audio_stream(ALLEGRO_AUDIO_STREAM *stream); #ifdef ALLEGRO_UNSTABLE bool emscripten_set_audio_stream_channel_matrix(ALLEGRO_AUDIO_STREAM *stream, const float *val);