core: Report sound duration as `f64` and round down in AS1
This commit is contained in:
parent
e4c6e29b8a
commit
3b6eea2a1d
|
@ -85,7 +85,11 @@ fn attach_sound<'gc>(
|
||||||
sound_object.set_sound(activation.context.gc_context, Some(*sound));
|
sound_object.set_sound(activation.context.gc_context, Some(*sound));
|
||||||
sound_object.set_duration(
|
sound_object.set_duration(
|
||||||
activation.context.gc_context,
|
activation.context.gc_context,
|
||||||
activation.context.audio.get_sound_duration(*sound),
|
activation
|
||||||
|
.context
|
||||||
|
.audio
|
||||||
|
.get_sound_duration(*sound)
|
||||||
|
.map(|d| d.round() as u32),
|
||||||
);
|
);
|
||||||
sound_object.set_position(activation.context.gc_context, 0);
|
sound_object.set_position(activation.context.gc_context, 0);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -87,7 +87,7 @@ pub trait AudioBackend: Downcast {
|
||||||
|
|
||||||
/// Get the duration of a sound in milliseconds.
|
/// Get the duration of a sound in milliseconds.
|
||||||
/// Returns `None` if sound is not registered.
|
/// Returns `None` if sound is not registered.
|
||||||
fn get_sound_duration(&self, sound: SoundHandle) -> Option<u32>;
|
fn get_sound_duration(&self, sound: SoundHandle) -> Option<f64>;
|
||||||
|
|
||||||
/// Get the size of the data stored within a given sound.
|
/// Get the size of the data stored within a given sound.
|
||||||
///
|
///
|
||||||
|
@ -113,8 +113,12 @@ pub trait AudioBackend: Downcast {
|
||||||
|
|
||||||
impl_downcast!(AudioBackend);
|
impl_downcast!(AudioBackend);
|
||||||
|
|
||||||
|
/// Information about a sound provided to `NullAudioBackend`.
|
||||||
struct NullSound {
|
struct NullSound {
|
||||||
duration: u32,
|
/// The duration of the sound in milliseconds.
|
||||||
|
duration: f64,
|
||||||
|
|
||||||
|
/// The compressed size of the sound data, excluding MP3 latency seek data.
|
||||||
size: u32,
|
size: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,10 +149,10 @@ impl AudioBackend for NullAudioBackend {
|
||||||
// AS duration does not subtract `skip_sample_frames`.
|
// AS duration does not subtract `skip_sample_frames`.
|
||||||
let num_sample_frames: f64 = sound.num_samples.into();
|
let num_sample_frames: f64 = sound.num_samples.into();
|
||||||
let sample_rate: f64 = sound.format.sample_rate.into();
|
let sample_rate: f64 = sound.format.sample_rate.into();
|
||||||
let ms = (num_sample_frames * 1000.0 / sample_rate).round();
|
let duration = num_sample_frames * 1000.0 / sample_rate;
|
||||||
|
|
||||||
Ok(self.sounds.insert(NullSound {
|
Ok(self.sounds.insert(NullSound {
|
||||||
duration: ms as u32,
|
duration,
|
||||||
size: data.len() as u32,
|
size: data.len() as u32,
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
@ -177,7 +181,7 @@ impl AudioBackend for NullAudioBackend {
|
||||||
fn get_sound_position(&self, _instance: SoundInstanceHandle) -> Option<u32> {
|
fn get_sound_position(&self, _instance: SoundInstanceHandle) -> Option<u32> {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
fn get_sound_duration(&self, sound: SoundHandle) -> Option<u32> {
|
fn get_sound_duration(&self, sound: SoundHandle) -> Option<f64> {
|
||||||
if let Some(sound) = self.sounds.get(sound) {
|
if let Some(sound) = self.sounds.get(sound) {
|
||||||
Some(sound.duration)
|
Some(sound.duration)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -401,13 +401,13 @@ impl AudioBackend for CpalAudioBackend {
|
||||||
sound_instances.get(instance).map(|_| 0)
|
sound_instances.get(instance).map(|_| 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_sound_duration(&self, sound: SoundHandle) -> Option<u32> {
|
fn get_sound_duration(&self, sound: SoundHandle) -> Option<f64> {
|
||||||
if let Some(sound) = self.sounds.get(sound) {
|
if let Some(sound) = self.sounds.get(sound) {
|
||||||
// AS duration does not subtract `skip_sample_frames`.
|
// AS duration does not subtract `skip_sample_frames`.
|
||||||
let num_sample_frames: f64 = sound.num_sample_frames.into();
|
let num_sample_frames: f64 = sound.num_sample_frames.into();
|
||||||
let sample_rate: f64 = sound.format.sample_rate.into();
|
let sample_rate: f64 = sound.format.sample_rate.into();
|
||||||
let ms = (num_sample_frames * 1000.0 / sample_rate).round();
|
let ms = num_sample_frames * 1000.0 / sample_rate;
|
||||||
Some(ms as u32)
|
Some(ms)
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
|
@ -1027,13 +1027,13 @@ impl AudioBackend for WebAudioBackend {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_sound_duration(&self, sound: SoundHandle) -> Option<u32> {
|
fn get_sound_duration(&self, sound: SoundHandle) -> Option<f64> {
|
||||||
if let Some(sound) = self.sounds.get(sound) {
|
if let Some(sound) = self.sounds.get(sound) {
|
||||||
// AS duration does not subtract `skip_sample_frames`.
|
// AS duration does not subtract `skip_sample_frames`.
|
||||||
let num_sample_frames: f64 = sound.num_sample_frames.into();
|
let num_sample_frames: f64 = sound.num_sample_frames.into();
|
||||||
let sample_rate: f64 = sound.format.sample_rate.into();
|
let sample_rate: f64 = sound.format.sample_rate.into();
|
||||||
let ms = (num_sample_frames * 1000.0 / sample_rate).round();
|
let ms = num_sample_frames * 1000.0 / sample_rate;
|
||||||
Some(ms as u32)
|
Some(ms)
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue