summaryrefslogtreecommitdiff
path: root/apps/audio_path.c
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2007-06-08 23:42:04 +0000
committerMichael Sevakis <jethead71@rockbox.org>2007-06-08 23:42:04 +0000
commit2d48d0ffa6baddd19e6ff077f25068f90af7be3d (patch)
tree68c80646a748496fee423d77aa43afafb783b269 /apps/audio_path.c
parenta85793fc54a0079f5483d5a5c6c60b7d17ca688c (diff)
downloadrockbox-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.c145
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 */