output/oss: move code to oss_probe_sample_format()
This commit is contained in:
parent
9ec9a8705e
commit
11e83eb7e7
@ -22,6 +22,7 @@
|
||||
#include "output_api.h"
|
||||
#include "mixer_list.h"
|
||||
#include "fd_util.h"
|
||||
#include "glib_compat.h"
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
@ -494,6 +495,46 @@ sample_format_from_oss(int format)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Probe one sample format.
|
||||
*
|
||||
* @return the selected sample format or SAMPLE_FORMAT_UNDEFINED on
|
||||
* error
|
||||
*/
|
||||
static enum oss_setup_result
|
||||
oss_probe_sample_format(int fd, enum sample_format sample_format,
|
||||
enum sample_format *sample_format_r,
|
||||
#ifdef AFMT_S24_PACKED
|
||||
struct pcm_export_state *export,
|
||||
#endif
|
||||
GError **error_r)
|
||||
{
|
||||
int oss_format = sample_format_to_oss(sample_format);
|
||||
if (oss_format == AFMT_QUERY)
|
||||
return UNSUPPORTED;
|
||||
|
||||
enum oss_setup_result result =
|
||||
oss_try_ioctl_r(fd, SNDCTL_DSP_SAMPLESIZE,
|
||||
&oss_format,
|
||||
"Failed to set sample format", error_r);
|
||||
if (result != SUCCESS)
|
||||
return result;
|
||||
|
||||
sample_format = sample_format_from_oss(oss_format);
|
||||
if (sample_format == SAMPLE_FORMAT_UNDEFINED)
|
||||
return UNSUPPORTED;
|
||||
|
||||
*sample_format_r = sample_format;
|
||||
|
||||
#ifdef AFMT_S24_PACKED
|
||||
pcm_export_open(export, sample_format,
|
||||
oss_format == AFMT_S24_PACKED &&
|
||||
G_BYTE_ORDER != G_LITTLE_ENDIAN);
|
||||
#endif
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set up the sample format, and attempts to find alternatives if the
|
||||
* specified format is not supported.
|
||||
@ -505,26 +546,17 @@ oss_setup_sample_format(int fd, struct audio_format *audio_format,
|
||||
#endif
|
||||
GError **error_r)
|
||||
{
|
||||
const char *const msg = "Failed to set sample format";
|
||||
int oss_format = sample_format_to_oss(audio_format->format);
|
||||
enum oss_setup_result result = oss_format != AFMT_QUERY
|
||||
? oss_try_ioctl_r(fd, SNDCTL_DSP_SAMPLESIZE,
|
||||
&oss_format, msg, error_r)
|
||||
: UNSUPPORTED;
|
||||
enum sample_format mpd_format;
|
||||
enum oss_setup_result result =
|
||||
oss_probe_sample_format(fd, audio_format->format,
|
||||
&mpd_format,
|
||||
#ifdef AFMT_S24_PACKED
|
||||
export,
|
||||
#endif
|
||||
error_r);
|
||||
switch (result) {
|
||||
case SUCCESS:
|
||||
mpd_format = sample_format_from_oss(oss_format);
|
||||
if (mpd_format == SAMPLE_FORMAT_UNDEFINED)
|
||||
break;
|
||||
|
||||
audio_format->format = mpd_format;
|
||||
|
||||
#ifdef AFMT_S24_PACKED
|
||||
pcm_export_open(export, mpd_format,
|
||||
oss_format == AFMT_S24_PACKED &&
|
||||
G_BYTE_ORDER != G_LITTLE_ENDIAN);
|
||||
#endif
|
||||
return true;
|
||||
|
||||
case ERROR:
|
||||
@ -534,6 +566,9 @@ oss_setup_sample_format(int fd, struct audio_format *audio_format,
|
||||
break;
|
||||
}
|
||||
|
||||
if (result != UNSUPPORTED)
|
||||
return result == SUCCESS;
|
||||
|
||||
/* the requested sample format is not available - probe for
|
||||
other formats supported by MPD */
|
||||
|
||||
@ -552,26 +587,15 @@ oss_setup_sample_format(int fd, struct audio_format *audio_format,
|
||||
/* don't try that again */
|
||||
continue;
|
||||
|
||||
oss_format = sample_format_to_oss(mpd_format);
|
||||
if (oss_format == AFMT_QUERY)
|
||||
/* not supported by this OSS version */
|
||||
continue;
|
||||
|
||||
result = oss_try_ioctl_r(fd, SNDCTL_DSP_SAMPLESIZE,
|
||||
&oss_format, msg, error_r);
|
||||
result = oss_probe_sample_format(fd, mpd_format,
|
||||
&mpd_format,
|
||||
#ifdef AFMT_S24_PACKED
|
||||
export,
|
||||
#endif
|
||||
error_r);
|
||||
switch (result) {
|
||||
case SUCCESS:
|
||||
mpd_format = sample_format_from_oss(oss_format);
|
||||
if (mpd_format == SAMPLE_FORMAT_UNDEFINED)
|
||||
break;
|
||||
|
||||
audio_format->format = mpd_format;
|
||||
|
||||
#ifdef AFMT_S24_PACKED
|
||||
pcm_export_open(export, mpd_format,
|
||||
oss_format == AFMT_S24_PACKED &&
|
||||
G_BYTE_ORDER != G_LITTLE_ENDIAN);
|
||||
#endif
|
||||
return true;
|
||||
|
||||
case ERROR:
|
||||
@ -582,7 +606,8 @@ oss_setup_sample_format(int fd, struct audio_format *audio_format,
|
||||
}
|
||||
}
|
||||
|
||||
g_set_error(error_r, oss_output_quark(), EINVAL, "%s", msg);
|
||||
g_set_error_literal(error_r, oss_output_quark(), EINVAL,
|
||||
"Failed to set sample format");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user