@@ -1181,8 +1181,10 @@ def _open(self, file, mode_int, closefd):
11811181 mode_int , self ._info , _ffi .NULL )
11821182 else :
11831183 raise TypeError ("Invalid file: {0!r}" .format (self .name ))
1184- _error_check (_snd .sf_error (file_ptr ),
1185- "Error opening {0!r}: " .format (self .name ))
1184+ if file_ptr == _ffi .NULL :
1185+ # get the actual error code
1186+ err = _snd .sf_error (file_ptr )
1187+ raise LibsndfileError (err , prefix = "Error opening {0!r}: " .format (self .name ))
11861188 if mode_int == _snd .SFM_WRITE :
11871189 # Due to a bug in libsndfile version <= 1.0.25, frames != 0
11881190 # when opening a named pipe in SFM_WRITE mode.
@@ -1538,8 +1540,14 @@ def __init__(self, code, prefix=""):
15381540 @property
15391541 def error_string (self ):
15401542 """Raw libsndfile error message."""
1541- err_str = _snd .sf_error_number (self .code )
1542- return _ffi .string (err_str ).decode ('utf-8' , 'replace' )
1543+ if self .code :
1544+ err_str = _snd .sf_error_number (self .code )
1545+ return _ffi .string (err_str ).decode ('utf-8' , 'replace' )
1546+ else :
1547+ # Due to race conditions, if used concurrently, sf_error() may
1548+ # return 0 (= no error) even if an error has happened.
1549+ # See https://github.com/erikd/libsndfile/issues/610 for details.
1550+ return "(Garbled error message from libsndfile)"
15431551
15441552 def __str__ (self ):
15451553 return self .prefix + self .error_string
0 commit comments