mirror of
https://github.com/RustAudio/rodio
synced 2024-11-10 06:04:16 +00:00
changes get_pos return type from f64 to Duration
This commit is contained in:
parent
637aec44fe
commit
cbfd0c59ed
3 changed files with 32 additions and 13 deletions
10
src/sink.rs
10
src/sink.rs
|
@ -64,7 +64,7 @@ struct Controls {
|
|||
speed: Mutex<f32>,
|
||||
to_clear: Mutex<u32>,
|
||||
seek: Mutex<Option<SeekOrder>>,
|
||||
position: Mutex<f64>,
|
||||
position: Mutex<Duration>,
|
||||
}
|
||||
|
||||
impl Sink {
|
||||
|
@ -91,7 +91,7 @@ impl Sink {
|
|||
speed: Mutex::new(1.0),
|
||||
to_clear: Mutex::new(0),
|
||||
seek: Mutex::new(None),
|
||||
position: Mutex::new(0.0),
|
||||
position: Mutex::new(Duration::ZERO),
|
||||
}),
|
||||
sound_count: Arc::new(AtomicUsize::new(0)),
|
||||
detached: false,
|
||||
|
@ -131,14 +131,14 @@ impl Sink {
|
|||
.periodic_access(Duration::from_millis(5), move |src| {
|
||||
if controls.stopped.load(Ordering::SeqCst) {
|
||||
src.stop();
|
||||
*controls.position.lock().unwrap() = 0.0;
|
||||
*controls.position.lock().unwrap() = Duration::ZERO;
|
||||
}
|
||||
{
|
||||
let mut to_clear = controls.to_clear.lock().unwrap();
|
||||
if *to_clear > 0 {
|
||||
src.inner_mut().skip();
|
||||
*to_clear -= 1;
|
||||
*controls.position.lock().unwrap() = 0.0;
|
||||
*controls.position.lock().unwrap() = Duration::ZERO;
|
||||
} else {
|
||||
*controls.position.lock().unwrap() = src.inner().inner().inner().inner().get_pos();
|
||||
}
|
||||
|
@ -327,7 +327,7 @@ impl Sink {
|
|||
/// [`get_pos()`](Sink::get_pos) returns *5s* then the position in the mp3
|
||||
/// recording is *10s* from its start.
|
||||
#[inline]
|
||||
pub fn get_pos(&self) -> f64 {
|
||||
pub fn get_pos(&self) -> Duration {
|
||||
*self.controls.position.lock().unwrap()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -63,9 +63,12 @@ where
|
|||
/// speedup's and delay's into account. Its recommended therefore to apply
|
||||
/// track_position after speedup's and delay's.
|
||||
#[inline]
|
||||
pub fn get_pos(&self) -> f64 {
|
||||
self.samples_counted as f64 / self.input.sample_rate() as f64 / self.input.channels() as f64
|
||||
+ self.offset_duration
|
||||
pub fn get_pos(&self) -> Duration {
|
||||
let seconds = self.samples_counted as f64
|
||||
/ self.input.sample_rate() as f64
|
||||
/ self.input.channels() as f64
|
||||
+ self.offset_duration;
|
||||
Duration::from_secs_f64(seconds)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
@ -166,14 +169,30 @@ mod tests {
|
|||
let inner = SamplesBuffer::new(1, 1, vec![10i16, -10, 10, -10, 20, -20]);
|
||||
let mut source = inner.track_position();
|
||||
|
||||
assert_eq!(source.get_pos(), 0.0);
|
||||
assert_eq!(source.get_pos().as_secs_f32(), 0.0);
|
||||
source.next();
|
||||
assert_eq!(source.get_pos(), 1.0);
|
||||
assert_eq!(source.get_pos().as_secs_f32(), 1.0);
|
||||
|
||||
source.next();
|
||||
assert_eq!(source.get_pos(), 2.0);
|
||||
assert_eq!(source.get_pos().as_secs_f32(), 2.0);
|
||||
|
||||
assert_eq!(source.try_seek(Duration::new(1, 0)).is_ok(), true);
|
||||
assert_eq!(source.get_pos(), 1.0);
|
||||
assert_eq!(source.get_pos().as_secs_f32(), 1.0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_position_in_presence_of_speedup() {
|
||||
let inner = SamplesBuffer::new(1, 1, vec![10i16, -10, 10, -10, 20, -20]);
|
||||
let mut source = inner.speed(2.0).track_position();
|
||||
|
||||
assert_eq!(source.get_pos().as_secs_f32(), 0.0);
|
||||
source.next();
|
||||
assert_eq!(source.get_pos().as_secs_f32(), 0.5);
|
||||
|
||||
source.next();
|
||||
assert_eq!(source.get_pos().as_secs_f32(), 1.0);
|
||||
|
||||
assert_eq!(source.try_seek(Duration::new(1, 0)).is_ok(), true);
|
||||
assert_eq!(source.get_pos().as_secs_f32(), 1.0);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -204,7 +204,7 @@ impl SpatialSink {
|
|||
/// [`get_pos()`](Sink::get_pos) returns *5s* then the position in the mp3
|
||||
/// recording is *10s* from its start.
|
||||
#[inline]
|
||||
pub fn get_pos(&self) -> f64 {
|
||||
pub fn get_pos(&self) -> Duration {
|
||||
self.sink.get_pos()
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue