@@ -64,6 +64,7 @@ WAVReader::WAVReader(WAVReader&& move)
6464{
6565 m_file = std::exchange (move.m_file , nullptr );
6666 m_frames_start = std::exchange (move.m_frames_start , 0 );
67+ m_bytes_per_frame = std::exchange (move.m_bytes_per_frame , 0 );
6768 m_sample_rate = std::exchange (move.m_sample_rate , 0 );
6869 m_num_channels = std::exchange (move.m_num_channels , 0 );
6970 m_num_frames = std::exchange (move.m_num_frames , 0 );
@@ -79,6 +80,7 @@ WAVReader& WAVReader::operator=(WAVReader&& move)
7980{
8081 m_file = std::exchange (move.m_file , nullptr );
8182 m_frames_start = std::exchange (move.m_frames_start , 0 );
83+ m_bytes_per_frame = std::exchange (move.m_bytes_per_frame , 0 );
8284 m_sample_rate = std::exchange (move.m_sample_rate , 0 );
8385 m_num_channels = std::exchange (move.m_num_channels , 0 );
8486 m_num_frames = std::exchange (move.m_num_frames , 0 );
@@ -182,6 +184,7 @@ bool WAVReader::Open(const char* path, Error* error /*= nullptr*/)
182184 m_file = fp.release ();
183185 m_frames_start = FileSystem::FTell64 (m_file);
184186 m_sample_rate = format.sample_rate ;
187+ m_bytes_per_frame = sizeof (s16) * format.num_channels ;
185188 m_num_channels = format.num_channels ;
186189 m_num_frames = num_frames;
187190 return true ;
@@ -194,7 +197,9 @@ void WAVReader::Close()
194197
195198 std::fclose (m_file);
196199 m_file = nullptr ;
200+ m_frames_start = 0 ;
197201 m_sample_rate = 0 ;
202+ m_bytes_per_frame = 0 ;
198203 m_num_channels = 0 ;
199204 m_num_frames = 0 ;
200205}
@@ -204,6 +209,7 @@ std::FILE* WAVReader::TakeFile()
204209 std::FILE* ret = std::exchange (m_file, nullptr );
205210 m_sample_rate = 0 ;
206211 m_frames_start = 0 ;
212+ m_bytes_per_frame = 0 ;
207213 m_num_channels = 0 ;
208214 m_num_frames = 0 ;
209215 return ret;
@@ -220,15 +226,19 @@ bool WAVReader::SeekToFrame(u32 num, Error* error)
220226 return FileSystem::FSeek64 (m_file, offset, SEEK_SET, error);
221227}
222228
223- bool WAVReader::ReadFrames (void * samples, u32 num_frames, Error* error /* = nullptr*/ )
229+ std::optional< u32 > WAVReader::ReadFrames (void * samples, u32 num_frames, Error* error /* = nullptr*/ )
224230{
225- if (std::fread (samples, sizeof (s16) * m_num_channels, num_frames, m_file) != num_frames)
231+ const size_t read = std::fread (samples, m_bytes_per_frame, num_frames, m_file);
232+ if (read == 0 )
226233 {
227- Error::SetErrno (error, " fread() failed: " , errno);
228- return false ;
234+ if (std::ferror (m_file))
235+ {
236+ Error::SetErrno (error, " fread() failed: " , errno);
237+ return std::nullopt ;
238+ }
229239 }
230240
231- return true ;
241+ return static_cast < u32 >(read) ;
232242}
233243
234244WAVWriter::WAVWriter () = default;
0 commit comments