decoder/{dsdiff,dsf,mpg123,wavpack}: avoid exceptions in scan methods

The scan methods must be "noexcept".
This commit is contained in:
Max Kellermann 2018-01-25 13:01:39 +01:00
parent 47fa8c4cf6
commit fd0a5a1116
4 changed files with 33 additions and 13 deletions

View File

@ -460,14 +460,15 @@ dsdiff_scan_stream(InputStream &is,
if (!dsdiff_read_metadata(nullptr, is, &metadata, &chunk_header)) if (!dsdiff_read_metadata(nullptr, is, &metadata, &chunk_header))
return false; return false;
auto audio_format = CheckAudioFormat(metadata.sample_rate / 8, const auto sample_rate = metadata.sample_rate / 8;
SampleFormat::DSD, if (!audio_valid_sample_rate(sample_rate) ||
metadata.channels); !audio_valid_channel_count(metadata.channels))
return false;
/* calculate song time and add as tag */ /* calculate song time and add as tag */
uint64_t n_frames = metadata.chunk_size / audio_format.channels; uint64_t n_frames = metadata.chunk_size / metadata.channels;
auto songtime = SongTime::FromScale<uint64_t>(n_frames, auto songtime = SongTime::FromScale<uint64_t>(n_frames,
audio_format.sample_rate); sample_rate);
tag_handler_invoke_duration(handler, handler_ctx, songtime); tag_handler_invoke_duration(handler, handler_ctx, songtime);
/* Read additional metadata and created tags if available */ /* Read additional metadata and created tags if available */

View File

@ -334,14 +334,14 @@ dsf_scan_stream(InputStream &is,
if (!dsf_read_metadata(nullptr, is, &metadata)) if (!dsf_read_metadata(nullptr, is, &metadata))
return false; return false;
auto audio_format = CheckAudioFormat(metadata.sample_rate / 8, const auto sample_rate = metadata.sample_rate / 8;
SampleFormat::DSD, if (!audio_valid_sample_rate(sample_rate))
metadata.channels); return false;
/* calculate song time and add as tag */ /* calculate song time and add as tag */
const auto n_blocks = metadata.n_blocks; const auto n_blocks = metadata.n_blocks;
auto songtime = SongTime::FromScale<uint64_t>(n_blocks * DSF_BLOCK_SIZE, auto songtime = SongTime::FromScale<uint64_t>(n_blocks * DSF_BLOCK_SIZE,
audio_format.sample_rate); sample_rate);
tag_handler_invoke_duration(handler, handler_ctx, songtime); tag_handler_invoke_duration(handler, handler_ctx, songtime);
#ifdef ENABLE_ID3TAG #ifdef ENABLE_ID3TAG

View File

@ -292,7 +292,12 @@ mpd_mpg123_scan_file(Path path_fs,
} }
AudioFormat audio_format; AudioFormat audio_format;
if (!mpd_mpg123_open(handle, path_fs.c_str(), audio_format)) { try {
if (!mpd_mpg123_open(handle, path_fs.c_str(), audio_format)) {
mpg123_delete(handle);
return false;
}
} catch (...) {
mpg123_delete(handle); mpg123_delete(handle);
return false; return false;
} }

View File

@ -581,7 +581,14 @@ static bool
wavpack_scan_file(Path path_fs, wavpack_scan_file(Path path_fs,
const TagHandler &handler, void *handler_ctx) noexcept const TagHandler &handler, void *handler_ctx) noexcept
{ {
auto *wpc = WavpackOpenInput(path_fs, OPEN_DSD_FLAG, 0); WavpackContext *wpc;
try {
wpc = WavpackOpenInput(path_fs, OPEN_DSD_FLAG, 0);
} catch (...) {
return false;
}
AtScopeExit(wpc) { AtScopeExit(wpc) {
WavpackCloseFile(wpc); WavpackCloseFile(wpc);
}; };
@ -598,8 +605,15 @@ wavpack_scan_stream(InputStream &is,
const TagHandler &handler, void *handler_ctx) noexcept const TagHandler &handler, void *handler_ctx) noexcept
{ {
WavpackInput isp(nullptr, is); WavpackInput isp(nullptr, is);
auto *wpc = WavpackOpenInput(&mpd_is_reader, &isp, nullptr,
OPEN_DSD_FLAG, 0); WavpackContext *wpc;
try {
wpc = WavpackOpenInput(&mpd_is_reader, &isp, nullptr,
OPEN_DSD_FLAG, 0);
} catch (...) {
return false;
}
AtScopeExit(wpc) { AtScopeExit(wpc) {
WavpackCloseFile(wpc); WavpackCloseFile(wpc);
}; };