From a82ebac53a23867452a62e3bd6c2516679ac95d8 Mon Sep 17 00:00:00 2001 From: Amaury Pouly Date: Sun, 1 Oct 2017 16:13:54 +0200 Subject: [PATCH] sonynwza10/a20: enable pcm frequency selection Change-Id: I335fcdbb652253e777d0d7406545d0d44d98f4f0 --- firmware/drivers/audio/nwzlinux-codec.c | 21 ++++++++++++++++++++- firmware/export/config/sonynwzlinux.h | 6 ++++++ firmware/target/hosted/alsa-controls.c | 9 +++++++++ firmware/target/hosted/alsa-controls.h | 2 ++ firmware/target/hosted/pcm-alsa.c | 4 ++++ 5 files changed, 41 insertions(+), 1 deletion(-) diff --git a/firmware/drivers/audio/nwzlinux-codec.c b/firmware/drivers/audio/nwzlinux-codec.c index aa0c7efcf8..36ebaa8b79 100644 --- a/firmware/drivers/audio/nwzlinux-codec.c +++ b/firmware/drivers/audio/nwzlinux-codec.c @@ -84,6 +84,15 @@ numid=4,iface=MIXER,name='Output Switch' ; Item #2 'LineFixed' ; Item #3 'Speaker' : values=0 +numid=6,iface=MIXER,name='Sampling Rate' + ; type=ENUMERATED,access=rw------,values=1,items=6 + ; Item #0 '44100' + ; Item #1 '48000' + ; Item #2 '88200' + ; Item #3 '96000' + ; Item #4 '176400' + ; Item #5 '192000' + : values=0 */ /* List of various codecs used by Sony */ @@ -111,6 +120,8 @@ static int fd_noican; static int fd_hw; /* Codec */ static enum nwz_codec_t nwz_codec; +/* does the code support setting the sample rate? */ +static bool has_sample_rate; static enum nwz_codec_t find_codec(void) { @@ -284,6 +295,8 @@ void audiohw_preinit(void) alsa_controls_set_enum("Output Switch", "Headphone"); /* unmute */ alsa_controls_set_bool("CODEC Mute Switch", false); + /* sample rate */ + has_sample_rate = alsa_has_control("Sampling Rate"); /* init noican */ noican_init(); @@ -381,5 +394,11 @@ void audiohw_close(void) void audiohw_set_frequency(int fsel) { - (void) fsel; + if(has_sample_rate) + { + /* it's slightly annoying that Sony put the value in an enum with strings... */ + char freq_str[16]; + sprintf(freq_str, "%d", fsel); + alsa_controls_set_enum("Sampling Rate", freq_str); + } } diff --git a/firmware/export/config/sonynwzlinux.h b/firmware/export/config/sonynwzlinux.h index f32c75c8b9..3ca0e014cb 100644 --- a/firmware/export/config/sonynwzlinux.h +++ b/firmware/export/config/sonynwzlinux.h @@ -65,6 +65,12 @@ /* There is no hardware tone control */ #define HAVE_SW_TONE_CONTROLS +/* The A15 and A25 support more sampling rates, in fact they support crazy high bit-rates such + * as 176.4 and 192 kHz but Rockbox does not support those */ +#if defined(SONY_NWZA10) || defined(SONY_NWA20) +#define HW_SAMPR_CAPS (SAMPR_CAP_44 | SAMPR_CAP_48 | SAMPR_CAP_88 | SAMPR_CAP_96) +#endif + /* KeyPad configuration for plugins */ #define CONFIG_KEYPAD SONY_NWZ_PAD #define HAS_BUTTON_HOLD diff --git a/firmware/target/hosted/alsa-controls.c b/firmware/target/hosted/alsa-controls.c index 9747fbefa9..289f2e76c9 100644 --- a/firmware/target/hosted/alsa-controls.c +++ b/firmware/target/hosted/alsa-controls.c @@ -72,6 +72,15 @@ bool alsa_controls_find(snd_ctl_elem_id_t *id, const char *name) return false; } +bool alsa_has_control(const char *name) +{ + snd_ctl_elem_id_t *id; + /* allocate things on stack */ + snd_ctl_elem_id_alloca(&id); + /* find control */ + return alsa_controls_find(id, name); +} + /* find a control element enum index by name, return -1 if not found */ int alsa_controls_find_enum(const char *name, const char *enum_name) { diff --git a/firmware/target/hosted/alsa-controls.h b/firmware/target/hosted/alsa-controls.h index ea2475a98e..f5c8439721 100644 --- a/firmware/target/hosted/alsa-controls.h +++ b/firmware/target/hosted/alsa-controls.h @@ -34,6 +34,8 @@ void alsa_controls_close(void); /* find a control element ID by name, return false of not found, the id needs * to be allocated */ bool alsa_controls_find(snd_ctl_elem_id_t *id, const char *name); +/* check wether a control exists */ +bool alsa_has_control(const char *name); /* find a control element enum index by name, return -1 if not found */ int alsa_controls_find_enum(const char *name, const char *enum_name); /* set a control, potentially supports several values */ diff --git a/firmware/target/hosted/pcm-alsa.c b/firmware/target/hosted/pcm-alsa.c index c84679e9f3..f6a3ffce71 100644 --- a/firmware/target/hosted/pcm-alsa.c +++ b/firmware/target/hosted/pcm-alsa.c @@ -479,6 +479,10 @@ static void pcm_dma_apply_settings_nolock(void) { snd_pcm_drop(handle); set_hwparams(handle, pcm_sampr); +#if defined(HAVE_NWZ_LINUX_CODEC) + /* Sony NWZ linux driver uses a nonstandard mecanism to set the sampling rate */ + audiohw_set_frequency(pcm_sampr); +#endif } void pcm_dma_apply_settings(void)