Skip to content

Commit cbfd0c5

Browse files
committed
changes get_pos return type from f64 to Duration
1 parent 637aec4 commit cbfd0c5

File tree

3 files changed

+32
-13
lines changed

3 files changed

+32
-13
lines changed

src/sink.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ struct Controls {
6464
speed: Mutex<f32>,
6565
to_clear: Mutex<u32>,
6666
seek: Mutex<Option<SeekOrder>>,
67-
position: Mutex<f64>,
67+
position: Mutex<Duration>,
6868
}
6969

7070
impl Sink {
@@ -91,7 +91,7 @@ impl Sink {
9191
speed: Mutex::new(1.0),
9292
to_clear: Mutex::new(0),
9393
seek: Mutex::new(None),
94-
position: Mutex::new(0.0),
94+
position: Mutex::new(Duration::ZERO),
9595
}),
9696
sound_count: Arc::new(AtomicUsize::new(0)),
9797
detached: false,
@@ -131,14 +131,14 @@ impl Sink {
131131
.periodic_access(Duration::from_millis(5), move |src| {
132132
if controls.stopped.load(Ordering::SeqCst) {
133133
src.stop();
134-
*controls.position.lock().unwrap() = 0.0;
134+
*controls.position.lock().unwrap() = Duration::ZERO;
135135
}
136136
{
137137
let mut to_clear = controls.to_clear.lock().unwrap();
138138
if *to_clear > 0 {
139139
src.inner_mut().skip();
140140
*to_clear -= 1;
141-
*controls.position.lock().unwrap() = 0.0;
141+
*controls.position.lock().unwrap() = Duration::ZERO;
142142
} else {
143143
*controls.position.lock().unwrap() = src.inner().inner().inner().inner().get_pos();
144144
}
@@ -327,7 +327,7 @@ impl Sink {
327327
/// [`get_pos()`](Sink::get_pos) returns *5s* then the position in the mp3
328328
/// recording is *10s* from its start.
329329
#[inline]
330-
pub fn get_pos(&self) -> f64 {
330+
pub fn get_pos(&self) -> Duration {
331331
*self.controls.position.lock().unwrap()
332332
}
333333
}

src/source/position.rs

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,12 @@ where
6363
/// speedup's and delay's into account. Its recommended therefore to apply
6464
/// track_position after speedup's and delay's.
6565
#[inline]
66-
pub fn get_pos(&self) -> f64 {
67-
self.samples_counted as f64 / self.input.sample_rate() as f64 / self.input.channels() as f64
68-
+ self.offset_duration
66+
pub fn get_pos(&self) -> Duration {
67+
let seconds = self.samples_counted as f64
68+
/ self.input.sample_rate() as f64
69+
/ self.input.channels() as f64
70+
+ self.offset_duration;
71+
Duration::from_secs_f64(seconds)
6972
}
7073

7174
#[inline]
@@ -166,14 +169,30 @@ mod tests {
166169
let inner = SamplesBuffer::new(1, 1, vec![10i16, -10, 10, -10, 20, -20]);
167170
let mut source = inner.track_position();
168171

169-
assert_eq!(source.get_pos(), 0.0);
172+
assert_eq!(source.get_pos().as_secs_f32(), 0.0);
170173
source.next();
171-
assert_eq!(source.get_pos(), 1.0);
174+
assert_eq!(source.get_pos().as_secs_f32(), 1.0);
172175

173176
source.next();
174-
assert_eq!(source.get_pos(), 2.0);
177+
assert_eq!(source.get_pos().as_secs_f32(), 2.0);
175178

176179
assert_eq!(source.try_seek(Duration::new(1, 0)).is_ok(), true);
177-
assert_eq!(source.get_pos(), 1.0);
180+
assert_eq!(source.get_pos().as_secs_f32(), 1.0);
181+
}
182+
183+
#[test]
184+
fn test_position_in_presence_of_speedup() {
185+
let inner = SamplesBuffer::new(1, 1, vec![10i16, -10, 10, -10, 20, -20]);
186+
let mut source = inner.speed(2.0).track_position();
187+
188+
assert_eq!(source.get_pos().as_secs_f32(), 0.0);
189+
source.next();
190+
assert_eq!(source.get_pos().as_secs_f32(), 0.5);
191+
192+
source.next();
193+
assert_eq!(source.get_pos().as_secs_f32(), 1.0);
194+
195+
assert_eq!(source.try_seek(Duration::new(1, 0)).is_ok(), true);
196+
assert_eq!(source.get_pos().as_secs_f32(), 1.0);
178197
}
179198
}

src/spatial_sink.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ impl SpatialSink {
204204
/// [`get_pos()`](Sink::get_pos) returns *5s* then the position in the mp3
205205
/// recording is *10s* from its start.
206206
#[inline]
207-
pub fn get_pos(&self) -> f64 {
207+
pub fn get_pos(&self) -> Duration {
208208
self.sink.get_pos()
209209
}
210210
}

0 commit comments

Comments
 (0)