diff options
| author | Michael Sevakis <jethead71@rockbox.org> | 2007-06-08 23:42:04 +0000 |
|---|---|---|
| committer | Michael Sevakis <jethead71@rockbox.org> | 2007-06-08 23:42:04 +0000 |
| commit | 2d48d0ffa6baddd19e6ff077f25068f90af7be3d (patch) | |
| tree | 68c80646a748496fee423d77aa43afafb783b269 /apps/audio_path.c | |
| parent | a85793fc54a0079f5483d5a5c6c60b7d17ca688c (diff) | |
| download | rockbox-2d48d0ffa6baddd19e6ff077f25068f90af7be3d.zip rockbox-2d48d0ffa6baddd19e6ff077f25068f90af7be3d.tar.gz rockbox-2d48d0ffa6baddd19e6ff077f25068f90af7be3d.tar.bz2 rockbox-2d48d0ffa6baddd19e6ff077f25068f90af7be3d.tar.xz | |
Straighten out some audio path APIs and misc. audio stuff. Having recording is not a prerequisite to having input/output source selection which is probably most useful when adding a audio input features like FM to a new port without forcing recording to be implemented first.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13599 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/audio_path.c')
| -rw-r--r-- | apps/audio_path.c | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/apps/audio_path.c b/apps/audio_path.c new file mode 100644 index 0000000..998b298 --- /dev/null +++ b/apps/audio_path.c @@ -0,0 +1,145 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Audio signal path management APIs + * + * Copyright (C) 2007 by Michael Sevakis + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#include "system.h" +#include "cpu.h" +#include "audio.h" +#include "general.h" +#include "settings.h" +#if defined(HAVE_SPDIF_IN) || defined(HAVE_SPDIF_OUT) +#ifdef HAVE_SPDIF_POWER +#include "power.h" +#endif +#include "spdif.h" +#endif +#if CONFIG_TUNER +#include "radio.h" +#endif + +/* Some audio sources may require a boosted CPU */ +#ifdef HAVE_ADJUSTABLE_CPU_FREQ +#ifdef HAVE_SPDIF_REC +#define AUDIO_CPU_BOOST +#endif +#endif + +#ifndef SIMULATOR + +#ifdef AUDIO_CPU_BOOST +static void audio_cpu_boost(bool state) +{ + static bool cpu_boosted = false; + + if (state != cpu_boosted) + { + cpu_boost(state); + cpu_boosted = state; + } +} /* audio_cpu_boost */ +#endif /* AUDIO_CPU_BOOST */ + +/** + * Selects an audio source for recording or playback + * powers/unpowers related devices and sets up monitoring. + */ +void audio_set_input_source(int source, unsigned flags) +{ + /** Do power up/down of associated device(s) **/ + + /** SPDIF **/ +#ifdef AUDIO_CPU_BOOST + /* Always boost for SPDIF */ + audio_cpu_boost(source == AUDIO_SRC_SPDIF); +#endif /* AUDIO_CPU_BOOST */ + +#ifdef HAVE_SPDIF_POWER + /* Check if S/PDIF output power should be switched off or on. NOTE: assumes + both optical in and out is controlled by the same power source, which is + the case on H1x0. */ + spdif_power_enable((source == AUDIO_SRC_SPDIF) || + global_settings.spdif_enable); +#endif /* HAVE_SPDIF_POWER */ + /* Set the appropriate feed for spdif output */ +#ifdef HAVE_SPDIF_OUT + spdif_set_output_source(source + IF_SPDIF_POWER_(, global_settings.spdif_enable)); +#endif /* HAVE_SPDIF_OUT */ + + /** Tuner **/ +#if CONFIG_TUNER + /* Switch radio off or on per source and flags. */ + if (source != AUDIO_SRC_FMRADIO) + radio_stop(); + else if (flags & SRCF_FMRADIO_PAUSED) + radio_pause(); + else + radio_start(); +#endif + + /* set hardware inputs */ + audio_input_mux(source, flags); +} /* audio_set_source */ + +#ifdef HAVE_SPDIF_IN +/** + * Return SPDIF sample rate index in audio_master_sampr_list. Since we base + * our reading on the actual SPDIF sample rate (which might be a bit + * inaccurate), we round off to the closest sample rate that is supported by + * SPDIF. + */ +int audio_get_spdif_sample_rate(void) +{ + unsigned long measured_rate = spdif_measure_frequency(); + /* Find which SPDIF sample rate we're closest to. */ + return round_value_to_list32(measured_rate, audio_master_sampr_list, + SAMPR_NUM_FREQ, false); +} /* audio_get_spdif_sample_rate */ +#endif /* HAVE_SPDIF_IN */ + +#else /* SIMULATOR */ + +/** Sim stubs **/ + +#ifdef AUDIO_CPU_BOOST +static void audio_cpu_boost(bool state) +{ + (void)state; +} /* audio_cpu_boost */ +#endif /* AUDIO_CPU_BOOST */ + +void audio_set_output_source(int source) +{ + (void)source; +} /* audio_set_output_source */ + +void audio_set_input_source(int source, unsigned flags) +{ + (void)source; + (void)flags; +} /* audio_set_input_source */ + +#ifdef HAVE_SPDIF_IN +int audio_get_spdif_sample_rate(void) +{ + return FREQ_44; +} /* audio_get_spdif_sample_rate */ +#endif /* HAVE_SPDIF_IN */ + +#endif /* !SIMULATOR */ |