diff --git a/pysoundfile.py b/pysoundfile.py index e78c0cd..a4a2aa5 100644 --- a/pysoundfile.py +++ b/pysoundfile.py @@ -831,6 +831,10 @@ def seek(self, frames, whence=SEEK_SET): self._handle_error() return position + def tell(self): + """Return the current read/write position.""" + return self.seek(0, SEEK_CUR) + def read(self, frames=-1, dtype='float64', always_2d=True, fill_value=None, out=None): """Read from the file and return data as NumPy array. @@ -916,7 +920,7 @@ def write(self, data): assert written == len(data) if self.seekable(): - curr = self.seek(0, SEEK_CUR) + curr = self.tell() self._info.frames = self.seek(0, SEEK_END) self.seek(curr, SEEK_SET) else: @@ -1105,7 +1109,7 @@ def _get_slice_bounds(self, frame): def _check_frames(self, frames, fill_value): # Check if frames is larger than the remaining frames in the file if self.seekable(): - remaining_frames = len(self) - self.seek(0, SEEK_CUR) + remaining_frames = len(self) - self.tell() if frames < 0 or (frames > remaining_frames and fill_value is None): frames = remaining_frames @@ -1142,7 +1146,7 @@ def _read_or_write(self, funcname, array, frames): assert array.size >= frames * self.channels if self.seekable(): - curr = self.seek(0, SEEK_CUR) + curr = self.tell() func = getattr(_snd, funcname + ffi_type) ptr = _ffi.cast(ffi_type + '*', array.__array_interface__['data'][0]) frames = func(self._file, ptr, frames) diff --git a/tests/test_pysoundfile.py b/tests/test_pysoundfile.py index ecc7fe9..bdf302e 100644 --- a/tests/test_pysoundfile.py +++ b/tests/test_pysoundfile.py @@ -442,13 +442,15 @@ def test_mode_should_be_in_readwrite_mode(sf_stereo_rplus): # ----------------------------------------------------------------------------- -# Test seek +# Test seek/tell # ----------------------------------------------------------------------------- def test_seek_in_read_mode(sf_stereo_r): assert sf_stereo_r.seek(0, sf.SEEK_CUR) == 0 + assert sf_stereo_r.tell() == 0 assert sf_stereo_r.seek(2) == 2 + assert sf_stereo_r.tell() == 2 assert sf_stereo_r.seek(2, sf.SEEK_CUR) == 4 assert sf_stereo_r.seek(-2, sf.SEEK_END) == len(data_stereo) - 2 with pytest.raises(RuntimeError): @@ -459,13 +461,17 @@ def test_seek_in_read_mode(sf_stereo_r): def test_seek_in_write_mode(sf_stereo_w): assert sf_stereo_w.seek(0, sf.SEEK_CUR) == 0 + assert sf_stereo_w.tell() == 0 assert sf_stereo_w.seek(2) == 2 + assert sf_stereo_w.tell() == 2 def test_seek_in_rplus_mode(sf_stereo_rplus): assert sf_stereo_rplus.seek(0, sf.SEEK_CUR) == 0 + assert sf_stereo_rplus.tell() == 0 assert sf_stereo_rplus.seek(2) == 2 assert sf_stereo_rplus.seek(0, sf.SEEK_CUR) == 2 + assert sf_stereo_rplus.tell() == 2 # -----------------------------------------------------------------------------