Remove the AUTO bit-depth setting. It's a hack and needs more consideration.

This commit is contained in:
Mike Brady
2019-02-28 14:21:05 +00:00
parent dc393b9859
commit 042d940415
5 changed files with 45 additions and 91 deletions
+44 -78
View File
@@ -339,83 +339,51 @@ int actual_open_alsa_device(void) {
return ret;
}
if (sample_format == SPS_FORMAT_AUTO) {
struct alsa_formats {
snd_pcm_format_t alsa_sound_format;
enum sps_format_t sps_sound_format;
int frame_size;
char * description;
};
struct alsa_formats formats[] = {{SND_PCM_FORMAT_S32,SPS_FORMAT_S32,8,"S32"},
{SND_PCM_FORMAT_S24,SPS_FORMAT_S24,8,"S24"},
{SND_PCM_FORMAT_S24_3LE,SPS_FORMAT_S24_3LE,6,"S24_LE"},
{SND_PCM_FORMAT_S24_3BE,SPS_FORMAT_S24_3BE,6,"S24_BE"},
{SND_PCM_FORMAT_S16,SPS_FORMAT_S16,4,"S16"}};
int acceptable_format_found = 0;
unsigned int i = 0;
while((!acceptable_format_found) && (i < sizeof(formats) / sizeof(formats[0]))) {
if (snd_pcm_hw_params_set_format(alsa_handle, alsa_params, formats[i].alsa_sound_format) == 0) {
acceptable_format_found = 1;
frame_size = formats[i].frame_size;
config.output_format = formats[i].sps_sound_format;
debug(1,"alsa: output format automatically chosen to be \"%s\".",formats[i].description);
} else {
i++;
}
}
if (!acceptable_format_found) {
die("Can't find a suitable automatic output format setting.");
}
} else {
snd_pcm_format_t sf;
switch (sample_format) {
case SPS_FORMAT_S8:
sf = SND_PCM_FORMAT_S8;
frame_size = 2;
break;
case SPS_FORMAT_U8:
sf = SND_PCM_FORMAT_U8;
frame_size = 2;
break;
case SPS_FORMAT_S16:
sf = SND_PCM_FORMAT_S16;
frame_size = 4;
break;
case SPS_FORMAT_S24:
sf = SND_PCM_FORMAT_S24;
frame_size = 8;
break;
case SPS_FORMAT_S24_3LE:
sf = SND_PCM_FORMAT_S24_3LE;
frame_size = 6;
break;
case SPS_FORMAT_S24_3BE:
sf = SND_PCM_FORMAT_S24_3BE;
frame_size = 6;
break;
case SPS_FORMAT_S32:
sf = SND_PCM_FORMAT_S32;
frame_size = 8;
break;
default:
sf = SND_PCM_FORMAT_S16; // this is just to quieten a compiler warning
frame_size = 4;
debug(1, "Unsupported output format at audio_alsa.c");
return -EINVAL;
}
ret = snd_pcm_hw_params_set_format(alsa_handle, alsa_params, sf);
if (ret < 0) {
warn("audio_alsa: Sample format %d not available for device \"%s\": %s", sample_format,
alsa_out_dev, snd_strerror(ret));
return ret;
}
snd_pcm_format_t sf;
switch (sample_format) {
case SPS_FORMAT_S8:
sf = SND_PCM_FORMAT_S8;
frame_size = 2;
break;
case SPS_FORMAT_U8:
sf = SND_PCM_FORMAT_U8;
frame_size = 2;
break;
case SPS_FORMAT_S16:
sf = SND_PCM_FORMAT_S16;
frame_size = 4;
break;
case SPS_FORMAT_S24:
sf = SND_PCM_FORMAT_S24;
frame_size = 8;
break;
case SPS_FORMAT_S24_3LE:
sf = SND_PCM_FORMAT_S24_3LE;
frame_size = 6;
break;
case SPS_FORMAT_S24_3BE:
sf = SND_PCM_FORMAT_S24_3BE;
frame_size = 6;
break;
case SPS_FORMAT_S32:
sf = SND_PCM_FORMAT_S32;
frame_size = 8;
break;
default:
sf = SND_PCM_FORMAT_S16; // this is just to quieten a compiler warning
frame_size = 4;
debug(1, "Unsupported output format at audio_alsa.c");
return -EINVAL;
}
ret = snd_pcm_hw_params_set_format(alsa_handle, alsa_params, sf);
if (ret < 0) {
warn("audio_alsa: Sample format %d not available for device \"%s\": %s", sample_format,
alsa_out_dev, snd_strerror(ret));
return ret;
}
if (set_period_size_request != 0) {
debug(1, "Attempting to set the period size");
ret = snd_pcm_hw_params_set_period_size_near(alsa_handle, alsa_params, &period_size_requested,
@@ -934,10 +902,8 @@ static int init(int argc, char **argv) {
config.output_format = SPS_FORMAT_U8;
else if (strcasecmp(str, "S8") == 0)
config.output_format = SPS_FORMAT_S8;
else if (strcasecmp(str, "AUTOMATIC") == 0)
config.output_format = SPS_FORMAT_AUTO;
else {
warn("Invalid output format \"%s\". It should be \"Automatic\", \"U8\", \"S8\", "
warn("Invalid output format \"%s\". It should be \"U8\", \"S8\", "
"\"S16\", \"S24\", "
"\"S24_3LE\", \"S24_3BE\" or "
"\"S32\". It is set to \"S16\".",
-2
View File
@@ -1391,8 +1391,6 @@ int64_t generate_zero_frames(char *outp, size_t number_of_frames, enum sps_forma
case SPS_FORMAT_UNKNOWN:
die("Unexpected SPS_FORMAT_UNKNOWN while calculating dither mask.");
break;
case SPS_FORMAT_AUTO:
die("Unexpected SPS_FORMAT_AUTO while calculating dither mask.");
}
dither_mask -= 1;
// int64_t r = r64i();
-1
View File
@@ -80,7 +80,6 @@ enum sps_format_t {
SPS_FORMAT_S24_3LE,
SPS_FORMAT_S24_3BE,
SPS_FORMAT_S32,
SPS_FORMAT_AUTO,
} sps_format_t;
typedef struct {
-9
View File
@@ -683,9 +683,6 @@ static inline void process_sample(int32_t sample, char **outp, enum sps_format_t
case SPS_FORMAT_UNKNOWN:
die("Unexpected SPS_FORMAT_UNKNOWN while calculating dither mask.");
break;
case SPS_FORMAT_AUTO:
die("Unexpected SPS_FORMAT_AUTO while calculating dither mask.");
break;
}
dither_mask -= 1;
// int64_t r = r64i();
@@ -763,9 +760,6 @@ static inline void process_sample(int32_t sample, char **outp, enum sps_format_t
case SPS_FORMAT_UNKNOWN:
die("Unexpected SPS_FORMAT_UNKNOWN while outputting samples");
break;
case SPS_FORMAT_AUTO:
die("Unexpected SPS_FORMAT_AUTO while outputting samples");
break;
}
*outp += result;
@@ -1653,9 +1647,6 @@ void *player_thread_func(void *arg) {
case SPS_FORMAT_UNKNOWN:
die("Unknown format choosing output bit depth");
break;
case SPS_FORMAT_AUTO:
die("Unexpected SPS_FORMAT_AUTO while outputting samples");
break;
}
debug(3, "Output bit depth is %d.", output_bit_depth);
+1 -1
View File
@@ -1577,7 +1577,7 @@ int main(int argc, char **argv) {
debug(1, "use_mmap_if_available is %d.", config.no_mmap ? 0 : 1);
debug(1, "output_rate is %d.", config.output_rate);
debug(1,
"output_format is %d (0-unknown, 1-S8, 2-U8, 3-S16, 4-S24, 5-S24_3LE, 6-S24_3BE, 7-S32, 8-Automatic).",
"output_format is %d (0-unknown, 1-S8, 2-U8, 3-S16, 4-S24, 5-S24_3LE, 6-S24_3BE, 7-S32).",
config.output_format);
debug(1, "audio backend desired buffer length is %f seconds.",
config.audio_backend_buffer_desired_length);