summaryrefslogtreecommitdiff
path: root/src/output/plugins/OssOutputPlugin.cxx
diff options
context:
space:
mode:
authorMax Kellermann <max@musicpd.org>2019-07-04 21:56:31 +0200
committerMax Kellermann <max@musicpd.org>2019-07-04 22:23:22 +0200
commitf54710b100f624a76015b0b325d01f25edb134cc (patch)
treebffb7a4e1a420b88a62ac69df26db1c882a8d228 /src/output/plugins/OssOutputPlugin.cxx
parent196db1a8c8c3ff902bec572e60b0d9611d282d66 (diff)
output/oss: replace enum oss_setup_result with bool
It's not a tri-state anymore since we introduced C++ exceptions.
Diffstat (limited to 'src/output/plugins/OssOutputPlugin.cxx')
-rw-r--r--src/output/plugins/OssOutputPlugin.cxx154
1 files changed, 50 insertions, 104 deletions
diff --git a/src/output/plugins/OssOutputPlugin.cxx b/src/output/plugins/OssOutputPlugin.cxx
index 01b14e0a2..f4f50da5a 100644
--- a/src/output/plugins/OssOutputPlugin.cxx
+++ b/src/output/plugins/OssOutputPlugin.cxx
@@ -238,19 +238,13 @@ OssOutput::DoClose()
}
/**
- * A tri-state type for oss_try_ioctl().
- */
-enum oss_setup_result {
- SUCCESS,
- UNSUPPORTED,
-};
-
-/**
- * Invoke an ioctl on the OSS file descriptor. On success, SUCCESS is
- * returned. If the parameter is not supported, UNSUPPORTED is
- * returned. Any other failure throws std::runtime_error.
+ * Invoke an ioctl on the OSS file descriptor.
+ *
+ * Throws on error.
+ *
+ * @return true success, false if the parameter is not supported
*/
-static enum oss_setup_result
+static bool
oss_try_ioctl_r(FileDescriptor fd, unsigned long request, int *value_r,
const char *msg)
{
@@ -260,20 +254,22 @@ oss_try_ioctl_r(FileDescriptor fd, unsigned long request, int *value_r,
int ret = ioctl(fd.Get(), request, value_r);
if (ret >= 0)
- return SUCCESS;
+ return true;
if (errno == EINVAL)
- return UNSUPPORTED;
+ return false;
throw MakeErrno(msg);
}
/**
- * Invoke an ioctl on the OSS file descriptor. On success, SUCCESS is
- * returned. If the parameter is not supported, UNSUPPORTED is
- * returned. Any other failure throws std::runtime_error.
+ * Invoke an ioctl on the OSS file descriptor.
+ *
+ * Throws on error.
+ *
+ * @return true success, false if the parameter is not supported
*/
-static enum oss_setup_result
+static bool
oss_try_ioctl(FileDescriptor fd, unsigned long request, int value,
const char *msg)
{
@@ -291,18 +287,11 @@ oss_setup_channels(FileDescriptor fd, AudioFormat &audio_format)
{
const char *const msg = "Failed to set channel count";
int channels = audio_format.channels;
- enum oss_setup_result result =
- oss_try_ioctl_r(fd, SNDCTL_DSP_CHANNELS, &channels, msg);
- switch (result) {
- case SUCCESS:
- if (!audio_valid_channel_count(channels))
- break;
+ if (oss_try_ioctl_r(fd, SNDCTL_DSP_CHANNELS, &channels, msg) &&
+ audio_valid_channel_count(channels)) {
audio_format.channels = channels;
return;
-
- case UNSUPPORTED:
- break;
}
for (unsigned i = 1; i < 2; ++i) {
@@ -311,18 +300,10 @@ oss_setup_channels(FileDescriptor fd, AudioFormat &audio_format)
continue;
channels = i;
- result = oss_try_ioctl_r(fd, SNDCTL_DSP_CHANNELS, &channels,
- msg);
- switch (result) {
- case SUCCESS:
- if (!audio_valid_channel_count(channels))
- break;
-
+ if (oss_try_ioctl_r(fd, SNDCTL_DSP_CHANNELS, &channels, msg) &&
+ audio_valid_channel_count(channels)) {
audio_format.channels = channels;
return;
-
- case UNSUPPORTED:
- break;
}
}
@@ -340,19 +321,11 @@ oss_setup_sample_rate(FileDescriptor fd, AudioFormat &audio_format)
{
const char *const msg = "Failed to set sample rate";
int sample_rate = audio_format.sample_rate;
- enum oss_setup_result result =
- oss_try_ioctl_r(fd, SNDCTL_DSP_SPEED, &sample_rate,
- msg);
- switch (result) {
- case SUCCESS:
- if (!audio_valid_sample_rate(sample_rate))
- break;
+ if (oss_try_ioctl_r(fd, SNDCTL_DSP_SPEED, &sample_rate, msg) &&
+ audio_valid_sample_rate(sample_rate)) {
audio_format.sample_rate = sample_rate;
return;
-
- case UNSUPPORTED:
- break;
}
static constexpr int sample_rates[] = { 48000, 44100, 0 };
@@ -361,18 +334,10 @@ oss_setup_sample_rate(FileDescriptor fd, AudioFormat &audio_format)
if (sample_rate == (int)audio_format.sample_rate)
continue;
- result = oss_try_ioctl_r(fd, SNDCTL_DSP_SPEED, &sample_rate,
- msg);
- switch (result) {
- case SUCCESS:
- if (!audio_valid_sample_rate(sample_rate))
- break;
-
+ if (oss_try_ioctl_r(fd, SNDCTL_DSP_SPEED, &sample_rate, msg) &&
+ audio_valid_sample_rate(sample_rate)) {
audio_format.sample_rate = sample_rate;
return;
-
- case UNSUPPORTED:
- break;
}
}
@@ -456,10 +421,11 @@ sample_format_from_oss(int format) noexcept
/**
* Probe one sample format.
*
- * @return the selected sample format or SampleFormat::UNDEFINED on
- * error
+ * Throws on error.
+ *
+ * @return true success, false if the parameter is not supported
*/
-static enum oss_setup_result
+static bool
oss_probe_sample_format(FileDescriptor fd, SampleFormat sample_format,
SampleFormat *sample_format_r,
int *oss_format_r
@@ -470,30 +436,30 @@ oss_probe_sample_format(FileDescriptor fd, SampleFormat sample_format,
{
int oss_format = sample_format_to_oss(sample_format);
if (oss_format == AFMT_QUERY)
- return UNSUPPORTED;
+ return false;
- enum oss_setup_result result =
+ bool success =
oss_try_ioctl_r(fd, SNDCTL_DSP_SAMPLESIZE,
&oss_format,
"Failed to set sample format");
#ifdef AFMT_S24_PACKED
- if (result == UNSUPPORTED && sample_format == SampleFormat::S24_P32) {
+ if (!success && sample_format == SampleFormat::S24_P32) {
/* if the driver doesn't support padded 24 bit, try
packed 24 bit */
oss_format = AFMT_S24_PACKED;
- result = oss_try_ioctl_r(fd, SNDCTL_DSP_SAMPLESIZE,
- &oss_format,
- "Failed to set sample format");
+ success = oss_try_ioctl_r(fd, SNDCTL_DSP_SAMPLESIZE,
+ &oss_format,
+ "Failed to set sample format");
}
#endif
- if (result != SUCCESS)
- return result;
+ if (!success)
+ return false;
sample_format = sample_format_from_oss(oss_format);
if (sample_format == SampleFormat::UNDEFINED)
- return UNSUPPORTED;
+ return false;
*sample_format_r = sample_format;
*oss_format_r = oss_format;
@@ -508,7 +474,7 @@ oss_probe_sample_format(FileDescriptor fd, SampleFormat sample_format,
pcm_export.Open(sample_format, 0, params);
#endif
- return SUCCESS;
+ return true;
}
/**
@@ -524,20 +490,14 @@ oss_setup_sample_format(FileDescriptor fd, AudioFormat &audio_format,
)
{
SampleFormat mpd_format;
- enum oss_setup_result result =
- oss_probe_sample_format(fd, audio_format.format,
- &mpd_format, oss_format_r
+ if (oss_probe_sample_format(fd, audio_format.format,
+ &mpd_format, oss_format_r
#ifdef AFMT_S24_PACKED
- , pcm_export
+ , pcm_export
#endif
- );
- switch (result) {
- case SUCCESS:
+ )) {
audio_format.format = mpd_format;
return;
-
- case UNSUPPORTED:
- break;
}
/* the requested sample format is not available - probe for
@@ -557,19 +517,14 @@ oss_setup_sample_format(FileDescriptor fd, AudioFormat &audio_format,
/* don't try that again */
continue;
- result = oss_probe_sample_format(fd, mpd_format,
- &mpd_format, oss_format_r
+ if (oss_probe_sample_format(fd, mpd_format,
+ &mpd_format, oss_format_r
#ifdef AFMT_S24_PACKED
- , pcm_export
+ , pcm_export
#endif
- );
- switch (result) {
- case SUCCESS:
+ )) {
audio_format.format = mpd_format;
return;
-
- case UNSUPPORTED:
- break;
}
}
@@ -599,29 +554,20 @@ try {
if (!fd.Open(device, O_WRONLY))
throw FormatErrno("Error opening OSS device \"%s\"", device);
- enum oss_setup_result result;
-
const char *const msg1 = "Failed to set channel count";
- result = oss_try_ioctl(fd, SNDCTL_DSP_CHANNELS,
- audio_format.channels, msg1);
- if (result != SUCCESS) {
+ if (!oss_try_ioctl(fd, SNDCTL_DSP_CHANNELS,
+ audio_format.channels, msg1))
throw std::runtime_error(msg1);
- }
const char *const msg2 = "Failed to set sample rate";
- result = oss_try_ioctl(fd, SNDCTL_DSP_SPEED,
- audio_format.sample_rate, msg2);
- if (result != SUCCESS) {
+ if (!oss_try_ioctl(fd, SNDCTL_DSP_SPEED,
+ audio_format.sample_rate, msg2))
throw std::runtime_error(msg2);
- }
const char *const msg3 = "Failed to set sample format";
- result = oss_try_ioctl(fd, SNDCTL_DSP_SAMPLESIZE,
- oss_format,
- msg3);
- if (result != SUCCESS) {
+ if (!oss_try_ioctl(fd, SNDCTL_DSP_SAMPLESIZE,
+ oss_format, msg3))
throw std::runtime_error(msg3);
- }
} catch (...) {
DoClose();
throw;