Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions pysoundfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
8 changes: 7 additions & 1 deletion tests/test_pysoundfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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


# -----------------------------------------------------------------------------
Expand Down