summaryrefslogtreecommitdiff
path: root/firmware/export
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/export')
-rw-r--r--firmware/export/audio.h106
-rw-r--r--firmware/export/config-h100.h6
-rw-r--r--firmware/export/config-h120.h6
-rw-r--r--firmware/export/config-h300.h7
-rw-r--r--firmware/export/config-iaudiox5.h6
-rw-r--r--firmware/export/id3.h91
-rw-r--r--firmware/export/pcm_playback.h16
-rw-r--r--firmware/export/pcm_record.h46
-rw-r--r--firmware/export/system.h81
-rw-r--r--firmware/export/thread.h3
-rw-r--r--firmware/export/tlv320.h10
-rw-r--r--firmware/export/uda1380.h13
12 files changed, 315 insertions, 76 deletions
diff --git a/firmware/export/audio.h b/firmware/export/audio.h
index 9099cb3..d3f544d 100644
--- a/firmware/export/audio.h
+++ b/firmware/export/audio.h
@@ -20,6 +20,20 @@
#define AUDIO_H
#include <stdbool.h>
+#include <sys/types.h>
+/* These must always be included with audio.h for this to compile under
+ cetain conditions. Do it here or else spread the complication around to
+ many files. */
+#if CONFIG_CODEC == SWCODEC
+#include "pcm_sampr.h"
+#include "pcm_playback.h"
+#ifdef HAVE_RECORDING
+#include "pcm_record.h"
+#include "id3.h"
+#include "enc_base.h"
+#endif /* HAVE_RECORDING */
+#endif /* CONFIG_CODEC == SWCODEC */
+
#ifdef SIMULATOR
#define audio_play(x) sim_audio_play(x)
@@ -31,9 +45,6 @@
#define AUDIO_STATUS_PRERECORD 8
#define AUDIO_STATUS_ERROR 16
-#define AUDIO_STATUS_STAYON_FLAGS \
- (AUDIO_STATUS_PLAY | AUDIO_STATUS_PAUSE | AUDIO_STATUS_RECORD | AUDIO_)
-
#define AUDIOERR_DISK_FULL 1
#define AUDIO_GAIN_LINEIN 0
@@ -72,10 +83,11 @@ void audio_resume(void);
void audio_next(void);
void audio_prev(void);
int audio_status(void);
-bool audio_query_poweroff(void);
+#if CONFIG_CODEC == SWCODEC
int audio_track_count(void); /* SWCODEC only */
long audio_filebufused(void); /* SWCODEC only */
void audio_pre_ff_rewind(void); /* SWCODEC only */
+#endif /* CONFIG_CODEC == SWCODEC */
void audio_ff_rewind(long newtime);
void audio_flush_and_reload_tracks(void);
struct mp3entry* audio_current_track(void);
@@ -89,18 +101,28 @@ void audio_error_clear(void);
int audio_get_file_pos(void);
void audio_beep(int duration);
void audio_init_playback(void);
+unsigned char *audio_get_buffer(bool talk_buf, size_t *buffer_size);
-/* audio recording functions */
-void audio_init_recording(unsigned int buffer_offset);
-void audio_close_recording(void);
-void audio_record(const char *filename);
-void audio_stop_recording(void);
-void audio_pause_recording(void);
-void audio_resume_recording(void);
-void audio_new_file(const char *filename);
+/* channel modes */
+enum rec_channel_modes
+{
+ __CHN_MODE_START_INDEX = -1,
+
+ CHN_MODE_STEREO,
+ CHN_MODE_MONO,
+
+ CHN_NUM_MODES
+};
+
+#if CONFIG_CODEC == SWCODEC
+/* channel mode capability bits */
+#define CHN_CAP_STEREO (1 << CHN_MODE_STEREO)
+#define CHN_CAP_MONO (1 << CHN_MODE_MONO)
+#define CHN_CAP_ALL (CHN_CAP_STEREO | CHN_CAP_MONO)
+#endif /* CONFIG_CODEC == SWCODEC */
/* audio sources */
-enum
+enum audio_sources
{
AUDIO_SRC_PLAYBACK = -1, /* for audio playback (default) */
AUDIO_SRC_MIC, /* monitor mic */
@@ -123,33 +145,57 @@ enum
AUDIO_SRC_MAX = AUDIO_NUM_SOURCES-1
};
-/* channel modes */
-enum
+#ifdef HAVE_RECORDING
+/* parameters for audio_set_recording_options */
+struct audio_recording_options
{
- CHN_MODE_MONO = 1,
- CHN_MODE_STEREO,
+ int rec_source;
+ int rec_frequency;
+ int rec_channels;
+ int rec_prerecord_time;
+#if CONFIG_CODEC == SWCODEC
+ int rec_source_flags; /* for rec_set_source */
+ struct encoder_config enc_config;
+#else
+ int rec_quality;
+ bool rec_editable;
+#endif
};
-void audio_set_recording_options(int frequency, int quality,
- int source, int channel_mode,
- bool editable, int prerecord_time);
+
+/* audio recording functions */
+void audio_init_recording(unsigned int buffer_offset);
+void audio_close_recording(void);
+void audio_record(const char *filename);
+void audio_stop_recording(void);
+void audio_pause_recording(void);
+void audio_resume_recording(void);
+void audio_new_file(const char *filename);
+void audio_set_recording_options(struct audio_recording_options *options);
void audio_set_recording_gain(int left, int right, int type);
unsigned long audio_recorded_time(void);
unsigned long audio_num_recorded_bytes(void);
-#if 0
-#ifdef HAVE_SPDIF_POWER
-void audio_set_spdif_power_setting(bool on);
-#endif
-#endif
-unsigned long audio_get_spdif_sample_rate(void);
-unsigned long audio_prev_elapsed(void);
+
#if CONFIG_CODEC == SWCODEC
-/* audio encoder functions (defined in playback.c) */
-int audio_get_encoder_id(void);
-void audio_load_encoder(int enc_id);
+/* SWCODEC recoring functions */
+/* playback.c */
+bool audio_load_encoder(int afmt);
void audio_remove_encoder(void);
+unsigned char *audio_get_recording_buffer(size_t *buffer_size);
#endif /* CONFIG_CODEC == SWCODEC */
+#endif /* HAVE_RECORDING */
+#ifdef HAVE_SPDIF_IN
+#ifdef HAVE_SPDIF_POWER
+void audio_set_spdif_power_setting(bool on);
+bool audio_get_spdif_power_setting(void);
+#endif
+/* returns index into rec_master_sampr_list */
+int audio_get_spdif_sample_rate(void);
+/* > 0: monitor EBUin, 0: Monitor IISrecv, <0: reset only */
+void audio_spdif_set_monitor(int monitor_spdif);
+#endif /* HAVE_SPDIF_IN */
+unsigned long audio_prev_elapsed(void);
/***********************************************************************/
diff --git a/firmware/export/config-h100.h b/firmware/export/config-h100.h
index 6f74078..285ab88 100644
--- a/firmware/export/config-h100.h
+++ b/firmware/export/config-h100.h
@@ -84,6 +84,12 @@
/* define this if you have recording possibility */
#define HAVE_RECORDING 1
+/* define hardware samples rate caps mask */
+#define HW_SAMPR_CAPS (SAMPR_CAP_88 | SAMPR_CAP_44 | SAMPR_CAP_22 | SAMPR_CAP_11)
+
+/* define the bitmask of recording sample rates */
+#define REC_SAMPR_CAPS (SAMPR_CAP_44 | SAMPR_CAP_22 | SAMPR_CAP_11)
+
#define HAVE_AGC
#ifndef SIMULATOR
diff --git a/firmware/export/config-h120.h b/firmware/export/config-h120.h
index 1476102..b22ff0e 100644
--- a/firmware/export/config-h120.h
+++ b/firmware/export/config-h120.h
@@ -77,6 +77,12 @@
/* define this if you have recording possibility */
#define HAVE_RECORDING 1
+/* define hardware samples rate caps mask */
+#define HW_SAMPR_CAPS (SAMPR_CAP_88 | SAMPR_CAP_44 | SAMPR_CAP_22 | SAMPR_CAP_11)
+
+/* define the bitmask of recording sample rates */
+#define REC_SAMPR_CAPS (SAMPR_CAP_44 | SAMPR_CAP_22 | SAMPR_CAP_11)
+
#define HAVE_AGC
#define BATTERY_CAPACITY_DEFAULT 1300 /* default battery capacity */
diff --git a/firmware/export/config-h300.h b/firmware/export/config-h300.h
index 31f0f67..748635d 100644
--- a/firmware/export/config-h300.h
+++ b/firmware/export/config-h300.h
@@ -72,6 +72,12 @@
/* define this if you have recording possibility */
#define HAVE_RECORDING 1
+/* define hardware samples rate caps mask */
+#define HW_SAMPR_CAPS (SAMPR_CAP_88 | SAMPR_CAP_44 | SAMPR_CAP_22 | SAMPR_CAP_11)
+
+/* define the bitmask of recording sample rates */
+#define REC_SAMPR_CAPS (SAMPR_CAP_44 | SAMPR_CAP_22 | SAMPR_CAP_11)
+
#define HAVE_AGC
#define BATTERY_CAPACITY_DEFAULT 1300 /* default battery capacity */
@@ -157,4 +163,3 @@
/* Define this for FM radio input available */
#define HAVE_FMRADIO_IN
-
diff --git a/firmware/export/config-iaudiox5.h b/firmware/export/config-iaudiox5.h
index 80b010a..d4c904e 100644
--- a/firmware/export/config-iaudiox5.h
+++ b/firmware/export/config-iaudiox5.h
@@ -9,6 +9,12 @@
/* define this if you have recording possibility */
#define HAVE_RECORDING 1
+/* define the bitmask of hardware sample rates */
+#define HW_SAMPR_CAPS (SAMPR_CAP_88 | SAMPR_CAP_44 | SAMPR_CAP_22 | SAMPR_CAP_11)
+
+/* define the bitmask of recording sample rates */
+#define REC_SAMPR_CAPS (SAMPR_CAP_88 | SAMPR_CAP_44 | SAMPR_CAP_22 | SAMPR_CAP_11)
+
/* define this if you have a bitmap LCD display */
#define HAVE_LCD_BITMAP 1
diff --git a/firmware/export/id3.h b/firmware/export/id3.h
index 1d07aff..dd099e0 100644
--- a/firmware/export/id3.h
+++ b/firmware/export/id3.h
@@ -24,13 +24,19 @@
#include "file.h"
/* Audio file types. */
-enum {
+enum
+{
AFMT_UNKNOWN = 0, /* Unknown file format */
+ /* start formats */
+
AFMT_MPA_L1, /* MPEG Audio layer 1 */
AFMT_MPA_L2, /* MPEG Audio layer 2 */
AFMT_MPA_L3, /* MPEG Audio layer 3 */
+ AFMT_AIFF, /* Audio Interchange File Format */
+
+#if CONFIG_CODEC == SWCODEC
AFMT_PCM_WAV, /* Uncompressed PCM in a WAV file */
AFMT_OGG_VORBIS, /* Ogg Vorbis */
AFMT_FLAC, /* FLAC */
@@ -40,54 +46,91 @@ enum {
AFMT_ALAC, /* Apple Lossless Audio Codec */
AFMT_AAC, /* Advanced Audio Coding (AAC) in M4A container */
AFMT_SHN, /* Shorten */
- AFMT_AIFF, /* Audio Interchange File Format */
AFMT_SID, /* SID File Format */
- AFMT_ADX, /* ADX */
+ AFMT_ADX, /* ADX File Format */
+#endif
- /* New formats must be added to the end of this list */
+ /* add new formats at any index above this line to have a sensible order -
+ specified array index inits are used */
+ /* format arrays defined in id3.c */
AFMT_NUM_CODECS,
-#if CONFIG_CODEC == SWCODEC
+#if CONFIG_CODEC == SWCODEC && defined(HAVE_RECORDING)
/* masks to decompose parts */
CODEC_AFMT_MASK = 0x0fff,
CODEC_TYPE_MASK = 0x7000,
/* switch for specifying codec type when requesting a filename */
CODEC_TYPE_DECODER = (0 << 12), /* default */
- CODEC_TYPE_ENCODER = (1 << 12)
-#endif
+ CODEC_TYPE_ENCODER = (1 << 12),
+#endif /* CONFIG_CODEC == SWCODEC && defined(HAVE_RECORDING) */
};
#if CONFIG_CODEC == SWCODEC
-#define AFMT_ENTRY(label, codec_fname, codec_enc_fname, enc_ext) \
- { label, codec_fname, codec_enc_fname, enc_ext }
-#else
-#define AFMT_ENTRY(label, codec_fname, codec_enc_fname, enc_ext) \
- { label }
-#endif
+#define CODEC_EXTENSION "codec"
+
+#ifdef HAVE_RECORDING
+#define ENCODER_SUFFIX "_enc"
+enum rec_format_indexes
+{
+ __REC_FORMAT_START_INDEX = -1,
+
+ /* start formats */
+
+ REC_FORMAT_PCM_WAV,
+ REC_FORMAT_WAVPACK,
+ REC_FORMAT_MPA_L3,
+
+ /* add new formats at any index above this line to have a sensible order -
+ specified array index inits are used
+ REC_FORMAT_CFG_NUM_BITS should allocate enough bits to hold the range
+ REC_FORMAT_CFG_VALUE_LIST should be in same order as indexes
+ */
+
+ REC_NUM_FORMATS,
+
+ REC_FORMAT_DEFAULT = REC_FORMAT_PCM_WAV,
+ REC_FORMAT_CFG_NUM_BITS = 2
+};
+
+#define REC_FORMAT_CFG_VAL_LIST "wave,wvpk,mpa3"
+
+/* get REC_FORMAT_* corresponding AFMT_* */
+extern const int rec_format_afmt[REC_NUM_FORMATS];
+/* get AFMT_* corresponding REC_FORMAT_* */
+extern const int afmt_rec_format[AFMT_NUM_CODECS];
+
+#define AFMT_ENTRY(label, root_fname, enc_root_fname, ext_list) \
+ { label, root_fname, enc_root_fname, ext_list }
+#else /* !HAVE_RECORDING */
+#define AFMT_ENTRY(label, root_fname, enc_root_fname, ext_list) \
+ { label, root_fname, ext_list }
+#endif /* HAVE_RECORDING */
+#else /* !SWCODEC */
+
+#define AFMT_ENTRY(label, root_fname, enc_root_fname, ext_list) \
+ { label, ext_list }
+#endif /* CONFIG_CODEC == SWCODEC */
/* record describing the audio format */
struct afmt_entry
{
-#if CONFIG_CODEC == SWCODEC
char label[8]; /* format label */
- char *codec_fn; /* filename of decoder codec */
- char *codec_enc_fn; /* filename of encoder codec */
- char *ext; /* default extension for file (enc only for now) */
-#else
- char label[4];
+#if CONFIG_CODEC == SWCODEC
+ char *codec_root_fn; /* root codec filename (sans _enc and .codec) */
+#ifdef HAVE_RECORDING
+ char *codec_enc_root_fn; /* filename of encoder codec */
+#endif
#endif
+ char *ext_list; /* double NULL terminated extension
+ list for type with the first as
+ the default for recording */
};
/* database of labels and codecs. add formats per above enum */
extern const struct afmt_entry audio_formats[AFMT_NUM_CODECS];
-#if CONFIG_CODEC == SWCODEC
-/* recording quality to AFMT_* */
-extern const int rec_quality_info_afmt[9];
-#endif
-
struct mp3entry {
char path[MAX_PATH];
char* title;
diff --git a/firmware/export/pcm_playback.h b/firmware/export/pcm_playback.h
index a4cd939..9c3e96b 100644
--- a/firmware/export/pcm_playback.h
+++ b/firmware/export/pcm_playback.h
@@ -19,11 +19,23 @@
#ifndef PCM_PLAYBACK_H
#define PCM_PLAYBACK_H
+#include <sys/types.h>
+
+/* Typedef for registered callback (play and record) */
+typedef void (*pcm_more_callback_type)(unsigned char **start,
+ size_t *size);
+
void pcm_init(void);
+
+/* set the pcm frequency - use values in hw_sampr_list
+ * use -1 for the default frequency
+ */
void pcm_set_frequency(unsigned int frequency);
+/* apply settings to hardware immediately */
+void pcm_apply_settings(bool reset);
/* This is for playing "raw" PCM data */
-void pcm_play_data(void (*get_more)(unsigned char** start, size_t* size),
+void pcm_play_data(pcm_more_callback_type get_more,
unsigned char* start, size_t size);
void pcm_calculate_peaks(int *left, int *right);
@@ -35,4 +47,4 @@ void pcm_play_pause(bool play);
bool pcm_is_paused(void);
bool pcm_is_playing(void);
-#endif
+#endif /* PCM_PLAYBACK_H */
diff --git a/firmware/export/pcm_record.h b/firmware/export/pcm_record.h
index b217335..c1187a4 100644
--- a/firmware/export/pcm_record.h
+++ b/firmware/export/pcm_record.h
@@ -20,24 +20,44 @@
#ifndef PCM_RECORD_H
#define PCM_RECORD_H
-void enc_set_parameters(int chunk_size, int num_chunks,
- int samp_per_chunk, char *head_ptr, int head_size,
- int enc_id);
-void enc_get_inputs(int *buffer_size, int *channels, int *quality);
-unsigned int* enc_alloc_chunk(void);
-void enc_free_chunk(void);
-int enc_wavbuf_near_empty(void);
-char* enc_get_wav_data(int size);
-extern void (*enc_set_header_callback)(void *head_buffer, int head_size,
- int num_pcm_samples, bool is_file_header);
+#define DMA_REC_ERROR_DMA ((size_t)-1)
+#ifdef HAVE_SPDIF_IN
+#define DMA_REC_ERROR_SPDIF ((size_t)-2)
+#endif
+/* Use AUDIO_SRC_* enumeration values */
+void pcm_set_monitor(int monitor);
+void pcm_set_rec_source(int source);
+
+/**
+ * RAW pcm data recording
+ * These calls are nescessary only when using the raw pcm apis directly.
+ */
+
+/* Initialize pcm recording interface */
+void pcm_init_recording(void);
+/* Uninitialze pcm recording interface */
+void pcm_close_recording(void);
+
+/* Start recording "raw" PCM data */
+void pcm_record_data(pcm_more_callback_type more_ready,
+ unsigned char *start, size_t size);
+/* Stop tranferring data into supplied buffer */
+void pcm_stop_recording(void);
+
+void pcm_calculate_rec_peaks(int *left, int *right);
+
+/** General functions for high level codec recording **/
+void pcm_rec_error_clear(void);
unsigned long pcm_rec_status(void);
void pcm_rec_init(void);
void pcm_rec_mux(int source);
int pcm_rec_current_bitrate(void);
+int pcm_rec_encoder_afmt(void); /* AFMT_* value, AFMT_UNKNOWN if none */
+int pcm_rec_rec_format(void); /* Format index or -1 otherwise */
+unsigned long pcm_rec_sample_rate(void);
int pcm_get_num_unprocessed(void);
-void pcm_rec_get_peaks(int *left, int *right);
-/* audio.h contains audio recording functions */
+/* audio.h contains audio_* recording functions */
-#endif
+#endif /* PCM_RECORD_H */
diff --git a/firmware/export/system.h b/firmware/export/system.h
index 4a33d80..9b90a6e 100644
--- a/firmware/export/system.h
+++ b/firmware/export/system.h
@@ -21,7 +21,6 @@
#define __SYSTEM_H__
#include "cpu.h"
-#include "config.h"
#include "stdbool.h"
extern void system_reboot (void);
@@ -111,6 +110,23 @@ const char *get_cpu_boost_tracker(void);
#define MAX(a, b) (((a)>(b))?(a):(b))
#endif
+/* return number of elements in array a */
+#define ARRAYLEN(a) (sizeof(a)/sizeof((a)[0]))
+
+/* return p incremented by specified number of bytes */
+#define SKIPBYTES(p, count) ((typeof (p))((char *)(p) + (count)))
+
+#define P2_M1(p2) ((1 << (p2))-1)
+
+/* align up or down to nearest 2^p2 */
+#define ALIGN_DOWN_P2(n, p2) ((n) & ~P2_M1(p2))
+#define ALIGN_UP_P2(n, p2) ALIGN_DOWN_P2((n) + P2_M1(p2),p2)
+
+/* align up or down to nearest integer multiple of a */
+#define ALIGN_DOWN(n, a) ((n)/(a)*(a))
+#define ALIGN_UP(n, a) ALIGN_DOWN((n)+((a)-1),a)
+
+/* live endianness conversion */
#ifdef ROCKBOX_LITTLE_ENDIAN
#define letoh16(x) (x)
#define letoh32(x) (x)
@@ -120,6 +136,8 @@ const char *get_cpu_boost_tracker(void);
#define betoh32(x) swap32(x)
#define htobe16(x) swap16(x)
#define htobe32(x) swap32(x)
+#define swap_odd_even_be32(x) (x)
+#define swap_odd_even_le32(x) swap_odd_even32(x)
#else
#define letoh16(x) swap16(x)
#define letoh32(x) swap32(x)
@@ -129,6 +147,37 @@ const char *get_cpu_boost_tracker(void);
#define betoh32(x) (x)
#define htobe16(x) (x)
#define htobe32(x) (x)
+#define swap_odd_even_be32(x) swap_odd_even32(x)
+#define swap_odd_even_le32(x) (x)
+#endif
+
+/* static endianness conversion */
+#define SWAP_16(x) ((typeof(x))(unsigned short)(((unsigned short)(x) >> 8) | \
+ ((unsigned short)(x) << 8)))
+
+#define SWAP_32(x) ((typeof(x))(unsigned long)( ((unsigned long)(x) >> 24) | \
+ (((unsigned long)(x) & 0xff0000ul) >> 8) | \
+ (((unsigned long)(x) & 0xff00ul) << 8) | \
+ ((unsigned long)(x) << 24)))
+
+#ifdef ROCKBOX_LITTLE_ENDIAN
+#define LE_TO_H16(x) (x)
+#define LE_TO_H32(x) (x)
+#define H_TO_LE16(x) (x)
+#define H_TO_LE32(x) (x)
+#define BE_TO_H16(x) SWAP_16(x)
+#define BE_TO_H32(x) SWAP_32(x)
+#define H_TO_BE16(x) SWAP_16(x)
+#define H_TO_BE32(x) SWAP_32(x)
+#else
+#define LE_TO_H16(x) SWAP_16(x)
+#define LE_TO_H32(x) SWAP_32(x)
+#define H_TO_LE16(x) SWAP_16(x)
+#define H_TO_LE32(x) SWAP_32(x)
+#define BE_TO_H16(x) (x)
+#define BE_TO_H32(x) (x)
+#define H_TO_BE16(x) (x)
+#define H_TO_BE32(x) (x)
#endif
@@ -181,6 +230,7 @@ enum {
: /* %0 */ I_CONSTRAINT((char)(mask)), \
/* %1 */ "z"(address-GBR))
+
#endif /* CONFIG_CPU == SH7034 */
#ifndef SIMULATOR
@@ -388,7 +438,20 @@ static inline unsigned long swap32(unsigned long value)
#define invalidate_icache()
#endif
-#else
+
+#ifndef CPU_COLDFIRE
+static inline unsigned long swap_odd_even32(unsigned long value)
+{
+ /*
+ result[31..24],[15.. 8] = value[23..16],[ 7.. 0]
+ result[23..16],[ 7.. 0] = value[31..24],[15.. 8]
+ */
+ unsigned long t = value & 0xff00ff00;
+ return (t >> 8) | ((t ^ value) << 8);
+}
+#endif
+
+#else /* SIMULATOR */
static inline unsigned short swap16(unsigned short value)
/*
@@ -412,8 +475,18 @@ static inline unsigned long swap32(unsigned long value)
return (lo << 16) | hi;
}
+static inline unsigned long swap_odd_even32(unsigned long value)
+{
+ /*
+ result[31..24],[15.. 8] = value[23..16],[ 7.. 0]
+ result[23..16],[ 7.. 0] = value[31..24],[15.. 8]
+ */
+ unsigned long t = value & 0xff00ff00;
+ return (t >> 8) | ((t ^ value) << 8);
+}
+
#define invalidate_icache()
-#endif
+#endif /* !SIMULATOR */
-#endif
+#endif /* __SYSTEM_H__ */
diff --git a/firmware/export/thread.h b/firmware/export/thread.h
index 17e6e3a..72c692e 100644
--- a/firmware/export/thread.h
+++ b/firmware/export/thread.h
@@ -142,7 +142,10 @@ void switch_thread(bool save_context, struct thread_entry **blocked_list);
void sleep_thread(int ticks);
void block_thread(struct thread_entry **thread, int timeout);
void wakeup_thread(struct thread_entry **thread);
+#ifdef HAVE_PRIORITY_SCHEDULING
int thread_set_priority(struct thread_entry *thread, int priority);
+int thread_get_priority(struct thread_entry *thread);
+#endif
void init_threads(void);
int thread_stack_usage(const struct thread_entry *thread);
int thread_get_status(const struct thread_entry *thread);
diff --git a/firmware/export/tlv320.h b/firmware/export/tlv320.h
index dfcbec4..023ec9d 100644
--- a/firmware/export/tlv320.h
+++ b/firmware/export/tlv320.h
@@ -24,6 +24,16 @@
extern void tlv320_init(void);
extern void tlv320_reset(void);
+/**
+ * Sets internal sample rate for DAC and ADC relative to MCLK
+ * Selection for frequency:
+ * Fs: tlv: with:
+ * 11025: 0 = MCLK/2 MCLK/2 SCLK, LRCK: Audio Clk / 16
+ * 22050: 0 = MCLK/2 MCLK SCLK, LRCK: Audio Clk / 8
+ * 44100: 1 = MCLK MCLK SCLK, LRCK: Audio Clk / 4 (default)
+ * 88200: 2 = MCLK*2 MCLK SCLK, LRCK: Audio Clk / 2
+ */
+extern void tlv320_set_frequency(unsigned fsel);
extern void tlv320_enable_output(bool enable);
extern void tlv320_set_headphone_vol(int vol_l, int vol_r);
extern void tlv320_set_recvol(int left, int right, int type);
diff --git a/firmware/export/uda1380.h b/firmware/export/uda1380.h
index 9c761c6..639ca8a 100644
--- a/firmware/export/uda1380.h
+++ b/firmware/export/uda1380.h
@@ -28,8 +28,17 @@ extern void uda1380_set_bass(int value);
extern void uda1380_set_treble(int value);
extern int uda1380_mute(int mute);
extern void uda1380_close(void);
-extern void uda1380_set_nsorder(int order);
-
+/**
+ * Sets frequency settings for DAC and ADC relative to MCLK
+ *
+ * Selection for frequency ranges:
+ * Fs: range: with:
+ * 11025: 0 = 6.25 to 12.5 SCLK, LRCK: Audio Clk / 16
+ * 22050: 1 = 12.5 to 25 SCLK, LRCK: Audio Clk / 8
+ * 44100: 2 = 25 to 50 SCLK, LRCK: Audio Clk / 4 (default)
+ * 88200: 3 = 50 to 100 SCLK, LRCK: Audio Clk / 2
+ */
+extern void uda1380_set_frequency(unsigned fsel);
extern void uda1380_enable_recording(bool source_mic);
extern void uda1380_disable_recording(void);
extern void uda1380_set_recvol(int left, int right, int type);