diff options
Diffstat (limited to 'firmware/export')
-rw-r--r-- | firmware/export/audio.h | 106 | ||||
-rw-r--r-- | firmware/export/config-h100.h | 6 | ||||
-rw-r--r-- | firmware/export/config-h120.h | 6 | ||||
-rw-r--r-- | firmware/export/config-h300.h | 7 | ||||
-rw-r--r-- | firmware/export/config-iaudiox5.h | 6 | ||||
-rw-r--r-- | firmware/export/id3.h | 91 | ||||
-rw-r--r-- | firmware/export/pcm_playback.h | 16 | ||||
-rw-r--r-- | firmware/export/pcm_record.h | 46 | ||||
-rw-r--r-- | firmware/export/system.h | 81 | ||||
-rw-r--r-- | firmware/export/thread.h | 3 | ||||
-rw-r--r-- | firmware/export/tlv320.h | 10 | ||||
-rw-r--r-- | firmware/export/uda1380.h | 13 |
12 files changed, 315 insertions, 76 deletions
diff --git a/firmware/export/audio.h b/firmware/export/audio.h index 9099cb3765..d3f544de94 100644 --- a/firmware/export/audio.h +++ b/firmware/export/audio.h | |||
@@ -20,6 +20,20 @@ | |||
20 | #define AUDIO_H | 20 | #define AUDIO_H |
21 | 21 | ||
22 | #include <stdbool.h> | 22 | #include <stdbool.h> |
23 | #include <sys/types.h> | ||
24 | /* These must always be included with audio.h for this to compile under | ||
25 | cetain conditions. Do it here or else spread the complication around to | ||
26 | many files. */ | ||
27 | #if CONFIG_CODEC == SWCODEC | ||
28 | #include "pcm_sampr.h" | ||
29 | #include "pcm_playback.h" | ||
30 | #ifdef HAVE_RECORDING | ||
31 | #include "pcm_record.h" | ||
32 | #include "id3.h" | ||
33 | #include "enc_base.h" | ||
34 | #endif /* HAVE_RECORDING */ | ||
35 | #endif /* CONFIG_CODEC == SWCODEC */ | ||
36 | |||
23 | 37 | ||
24 | #ifdef SIMULATOR | 38 | #ifdef SIMULATOR |
25 | #define audio_play(x) sim_audio_play(x) | 39 | #define audio_play(x) sim_audio_play(x) |
@@ -31,9 +45,6 @@ | |||
31 | #define AUDIO_STATUS_PRERECORD 8 | 45 | #define AUDIO_STATUS_PRERECORD 8 |
32 | #define AUDIO_STATUS_ERROR 16 | 46 | #define AUDIO_STATUS_ERROR 16 |
33 | 47 | ||
34 | #define AUDIO_STATUS_STAYON_FLAGS \ | ||
35 | (AUDIO_STATUS_PLAY | AUDIO_STATUS_PAUSE | AUDIO_STATUS_RECORD | AUDIO_) | ||
36 | |||
37 | #define AUDIOERR_DISK_FULL 1 | 48 | #define AUDIOERR_DISK_FULL 1 |
38 | 49 | ||
39 | #define AUDIO_GAIN_LINEIN 0 | 50 | #define AUDIO_GAIN_LINEIN 0 |
@@ -72,10 +83,11 @@ void audio_resume(void); | |||
72 | void audio_next(void); | 83 | void audio_next(void); |
73 | void audio_prev(void); | 84 | void audio_prev(void); |
74 | int audio_status(void); | 85 | int audio_status(void); |
75 | bool audio_query_poweroff(void); | 86 | #if CONFIG_CODEC == SWCODEC |
76 | int audio_track_count(void); /* SWCODEC only */ | 87 | int audio_track_count(void); /* SWCODEC only */ |
77 | long audio_filebufused(void); /* SWCODEC only */ | 88 | long audio_filebufused(void); /* SWCODEC only */ |
78 | void audio_pre_ff_rewind(void); /* SWCODEC only */ | 89 | void audio_pre_ff_rewind(void); /* SWCODEC only */ |
90 | #endif /* CONFIG_CODEC == SWCODEC */ | ||
79 | void audio_ff_rewind(long newtime); | 91 | void audio_ff_rewind(long newtime); |
80 | void audio_flush_and_reload_tracks(void); | 92 | void audio_flush_and_reload_tracks(void); |
81 | struct mp3entry* audio_current_track(void); | 93 | struct mp3entry* audio_current_track(void); |
@@ -89,18 +101,28 @@ void audio_error_clear(void); | |||
89 | int audio_get_file_pos(void); | 101 | int audio_get_file_pos(void); |
90 | void audio_beep(int duration); | 102 | void audio_beep(int duration); |
91 | void audio_init_playback(void); | 103 | void audio_init_playback(void); |
104 | unsigned char *audio_get_buffer(bool talk_buf, size_t *buffer_size); | ||
92 | 105 | ||
93 | /* audio recording functions */ | 106 | /* channel modes */ |
94 | void audio_init_recording(unsigned int buffer_offset); | 107 | enum rec_channel_modes |
95 | void audio_close_recording(void); | 108 | { |
96 | void audio_record(const char *filename); | 109 | __CHN_MODE_START_INDEX = -1, |
97 | void audio_stop_recording(void); | 110 | |
98 | void audio_pause_recording(void); | 111 | CHN_MODE_STEREO, |
99 | void audio_resume_recording(void); | 112 | CHN_MODE_MONO, |
100 | void audio_new_file(const char *filename); | 113 | |
114 | CHN_NUM_MODES | ||
115 | }; | ||
116 | |||
117 | #if CONFIG_CODEC == SWCODEC | ||
118 | /* channel mode capability bits */ | ||
119 | #define CHN_CAP_STEREO (1 << CHN_MODE_STEREO) | ||
120 | #define CHN_CAP_MONO (1 << CHN_MODE_MONO) | ||
121 | #define CHN_CAP_ALL (CHN_CAP_STEREO | CHN_CAP_MONO) | ||
122 | #endif /* CONFIG_CODEC == SWCODEC */ | ||
101 | 123 | ||
102 | /* audio sources */ | 124 | /* audio sources */ |
103 | enum | 125 | enum audio_sources |
104 | { | 126 | { |
105 | AUDIO_SRC_PLAYBACK = -1, /* for audio playback (default) */ | 127 | AUDIO_SRC_PLAYBACK = -1, /* for audio playback (default) */ |
106 | AUDIO_SRC_MIC, /* monitor mic */ | 128 | AUDIO_SRC_MIC, /* monitor mic */ |
@@ -123,33 +145,57 @@ enum | |||
123 | AUDIO_SRC_MAX = AUDIO_NUM_SOURCES-1 | 145 | AUDIO_SRC_MAX = AUDIO_NUM_SOURCES-1 |
124 | }; | 146 | }; |
125 | 147 | ||
126 | /* channel modes */ | 148 | #ifdef HAVE_RECORDING |
127 | enum | 149 | /* parameters for audio_set_recording_options */ |
150 | struct audio_recording_options | ||
128 | { | 151 | { |
129 | CHN_MODE_MONO = 1, | 152 | int rec_source; |
130 | CHN_MODE_STEREO, | 153 | int rec_frequency; |
154 | int rec_channels; | ||
155 | int rec_prerecord_time; | ||
156 | #if CONFIG_CODEC == SWCODEC | ||
157 | int rec_source_flags; /* for rec_set_source */ | ||
158 | struct encoder_config enc_config; | ||
159 | #else | ||
160 | int rec_quality; | ||
161 | bool rec_editable; | ||
162 | #endif | ||
131 | }; | 163 | }; |
132 | void audio_set_recording_options(int frequency, int quality, | 164 | |
133 | int source, int channel_mode, | 165 | /* audio recording functions */ |
134 | bool editable, int prerecord_time); | 166 | void audio_init_recording(unsigned int buffer_offset); |
167 | void audio_close_recording(void); | ||
168 | void audio_record(const char *filename); | ||
169 | void audio_stop_recording(void); | ||
170 | void audio_pause_recording(void); | ||
171 | void audio_resume_recording(void); | ||
172 | void audio_new_file(const char *filename); | ||
173 | void audio_set_recording_options(struct audio_recording_options *options); | ||
135 | void audio_set_recording_gain(int left, int right, int type); | 174 | void audio_set_recording_gain(int left, int right, int type); |
136 | unsigned long audio_recorded_time(void); | 175 | unsigned long audio_recorded_time(void); |
137 | unsigned long audio_num_recorded_bytes(void); | 176 | unsigned long audio_num_recorded_bytes(void); |
138 | #if 0 | 177 | |
139 | #ifdef HAVE_SPDIF_POWER | ||
140 | void audio_set_spdif_power_setting(bool on); | ||
141 | #endif | ||
142 | #endif | ||
143 | unsigned long audio_get_spdif_sample_rate(void); | ||
144 | unsigned long audio_prev_elapsed(void); | ||
145 | #if CONFIG_CODEC == SWCODEC | 178 | #if CONFIG_CODEC == SWCODEC |
146 | /* audio encoder functions (defined in playback.c) */ | 179 | /* SWCODEC recoring functions */ |
147 | int audio_get_encoder_id(void); | 180 | /* playback.c */ |
148 | void audio_load_encoder(int enc_id); | 181 | bool audio_load_encoder(int afmt); |
149 | void audio_remove_encoder(void); | 182 | void audio_remove_encoder(void); |
183 | unsigned char *audio_get_recording_buffer(size_t *buffer_size); | ||
150 | #endif /* CONFIG_CODEC == SWCODEC */ | 184 | #endif /* CONFIG_CODEC == SWCODEC */ |
185 | #endif /* HAVE_RECORDING */ | ||
151 | 186 | ||
187 | #ifdef HAVE_SPDIF_IN | ||
188 | #ifdef HAVE_SPDIF_POWER | ||
189 | void audio_set_spdif_power_setting(bool on); | ||
190 | bool audio_get_spdif_power_setting(void); | ||
191 | #endif | ||
192 | /* returns index into rec_master_sampr_list */ | ||
193 | int audio_get_spdif_sample_rate(void); | ||
194 | /* > 0: monitor EBUin, 0: Monitor IISrecv, <0: reset only */ | ||
195 | void audio_spdif_set_monitor(int monitor_spdif); | ||
196 | #endif /* HAVE_SPDIF_IN */ | ||
152 | 197 | ||
198 | unsigned long audio_prev_elapsed(void); | ||
153 | 199 | ||
154 | 200 | ||
155 | /***********************************************************************/ | 201 | /***********************************************************************/ |
diff --git a/firmware/export/config-h100.h b/firmware/export/config-h100.h index 6f74078e1e..285ab88930 100644 --- a/firmware/export/config-h100.h +++ b/firmware/export/config-h100.h | |||
@@ -84,6 +84,12 @@ | |||
84 | /* define this if you have recording possibility */ | 84 | /* define this if you have recording possibility */ |
85 | #define HAVE_RECORDING 1 | 85 | #define HAVE_RECORDING 1 |
86 | 86 | ||
87 | /* define hardware samples rate caps mask */ | ||
88 | #define HW_SAMPR_CAPS (SAMPR_CAP_88 | SAMPR_CAP_44 | SAMPR_CAP_22 | SAMPR_CAP_11) | ||
89 | |||
90 | /* define the bitmask of recording sample rates */ | ||
91 | #define REC_SAMPR_CAPS (SAMPR_CAP_44 | SAMPR_CAP_22 | SAMPR_CAP_11) | ||
92 | |||
87 | #define HAVE_AGC | 93 | #define HAVE_AGC |
88 | 94 | ||
89 | #ifndef SIMULATOR | 95 | #ifndef SIMULATOR |
diff --git a/firmware/export/config-h120.h b/firmware/export/config-h120.h index 1476102100..b22ff0eb22 100644 --- a/firmware/export/config-h120.h +++ b/firmware/export/config-h120.h | |||
@@ -77,6 +77,12 @@ | |||
77 | /* define this if you have recording possibility */ | 77 | /* define this if you have recording possibility */ |
78 | #define HAVE_RECORDING 1 | 78 | #define HAVE_RECORDING 1 |
79 | 79 | ||
80 | /* define hardware samples rate caps mask */ | ||
81 | #define HW_SAMPR_CAPS (SAMPR_CAP_88 | SAMPR_CAP_44 | SAMPR_CAP_22 | SAMPR_CAP_11) | ||
82 | |||
83 | /* define the bitmask of recording sample rates */ | ||
84 | #define REC_SAMPR_CAPS (SAMPR_CAP_44 | SAMPR_CAP_22 | SAMPR_CAP_11) | ||
85 | |||
80 | #define HAVE_AGC | 86 | #define HAVE_AGC |
81 | 87 | ||
82 | #define BATTERY_CAPACITY_DEFAULT 1300 /* default battery capacity */ | 88 | #define BATTERY_CAPACITY_DEFAULT 1300 /* default battery capacity */ |
diff --git a/firmware/export/config-h300.h b/firmware/export/config-h300.h index 31f0f6729f..748635dcb4 100644 --- a/firmware/export/config-h300.h +++ b/firmware/export/config-h300.h | |||
@@ -72,6 +72,12 @@ | |||
72 | /* define this if you have recording possibility */ | 72 | /* define this if you have recording possibility */ |
73 | #define HAVE_RECORDING 1 | 73 | #define HAVE_RECORDING 1 |
74 | 74 | ||
75 | /* define hardware samples rate caps mask */ | ||
76 | #define HW_SAMPR_CAPS (SAMPR_CAP_88 | SAMPR_CAP_44 | SAMPR_CAP_22 | SAMPR_CAP_11) | ||
77 | |||
78 | /* define the bitmask of recording sample rates */ | ||
79 | #define REC_SAMPR_CAPS (SAMPR_CAP_44 | SAMPR_CAP_22 | SAMPR_CAP_11) | ||
80 | |||
75 | #define HAVE_AGC | 81 | #define HAVE_AGC |
76 | 82 | ||
77 | #define BATTERY_CAPACITY_DEFAULT 1300 /* default battery capacity */ | 83 | #define BATTERY_CAPACITY_DEFAULT 1300 /* default battery capacity */ |
@@ -157,4 +163,3 @@ | |||
157 | 163 | ||
158 | /* Define this for FM radio input available */ | 164 | /* Define this for FM radio input available */ |
159 | #define HAVE_FMRADIO_IN | 165 | #define HAVE_FMRADIO_IN |
160 | |||
diff --git a/firmware/export/config-iaudiox5.h b/firmware/export/config-iaudiox5.h index 80b010a6b0..d4c904ed23 100644 --- a/firmware/export/config-iaudiox5.h +++ b/firmware/export/config-iaudiox5.h | |||
@@ -9,6 +9,12 @@ | |||
9 | /* define this if you have recording possibility */ | 9 | /* define this if you have recording possibility */ |
10 | #define HAVE_RECORDING 1 | 10 | #define HAVE_RECORDING 1 |
11 | 11 | ||
12 | /* define the bitmask of hardware sample rates */ | ||
13 | #define HW_SAMPR_CAPS (SAMPR_CAP_88 | SAMPR_CAP_44 | SAMPR_CAP_22 | SAMPR_CAP_11) | ||
14 | |||
15 | /* define the bitmask of recording sample rates */ | ||
16 | #define REC_SAMPR_CAPS (SAMPR_CAP_88 | SAMPR_CAP_44 | SAMPR_CAP_22 | SAMPR_CAP_11) | ||
17 | |||
12 | /* define this if you have a bitmap LCD display */ | 18 | /* define this if you have a bitmap LCD display */ |
13 | #define HAVE_LCD_BITMAP 1 | 19 | #define HAVE_LCD_BITMAP 1 |
14 | 20 | ||
diff --git a/firmware/export/id3.h b/firmware/export/id3.h index 1d07affbfa..dd099e0204 100644 --- a/firmware/export/id3.h +++ b/firmware/export/id3.h | |||
@@ -24,13 +24,19 @@ | |||
24 | #include "file.h" | 24 | #include "file.h" |
25 | 25 | ||
26 | /* Audio file types. */ | 26 | /* Audio file types. */ |
27 | enum { | 27 | enum |
28 | { | ||
28 | AFMT_UNKNOWN = 0, /* Unknown file format */ | 29 | AFMT_UNKNOWN = 0, /* Unknown file format */ |
29 | 30 | ||
31 | /* start formats */ | ||
32 | |||
30 | AFMT_MPA_L1, /* MPEG Audio layer 1 */ | 33 | AFMT_MPA_L1, /* MPEG Audio layer 1 */ |
31 | AFMT_MPA_L2, /* MPEG Audio layer 2 */ | 34 | AFMT_MPA_L2, /* MPEG Audio layer 2 */ |
32 | AFMT_MPA_L3, /* MPEG Audio layer 3 */ | 35 | AFMT_MPA_L3, /* MPEG Audio layer 3 */ |
33 | 36 | ||
37 | AFMT_AIFF, /* Audio Interchange File Format */ | ||
38 | |||
39 | #if CONFIG_CODEC == SWCODEC | ||
34 | AFMT_PCM_WAV, /* Uncompressed PCM in a WAV file */ | 40 | AFMT_PCM_WAV, /* Uncompressed PCM in a WAV file */ |
35 | AFMT_OGG_VORBIS, /* Ogg Vorbis */ | 41 | AFMT_OGG_VORBIS, /* Ogg Vorbis */ |
36 | AFMT_FLAC, /* FLAC */ | 42 | AFMT_FLAC, /* FLAC */ |
@@ -40,54 +46,91 @@ enum { | |||
40 | AFMT_ALAC, /* Apple Lossless Audio Codec */ | 46 | AFMT_ALAC, /* Apple Lossless Audio Codec */ |
41 | AFMT_AAC, /* Advanced Audio Coding (AAC) in M4A container */ | 47 | AFMT_AAC, /* Advanced Audio Coding (AAC) in M4A container */ |
42 | AFMT_SHN, /* Shorten */ | 48 | AFMT_SHN, /* Shorten */ |
43 | AFMT_AIFF, /* Audio Interchange File Format */ | ||
44 | AFMT_SID, /* SID File Format */ | 49 | AFMT_SID, /* SID File Format */ |
45 | AFMT_ADX, /* ADX */ | 50 | AFMT_ADX, /* ADX File Format */ |
51 | #endif | ||
46 | 52 | ||
47 | /* New formats must be added to the end of this list */ | 53 | /* add new formats at any index above this line to have a sensible order - |
54 | specified array index inits are used */ | ||
55 | /* format arrays defined in id3.c */ | ||
48 | 56 | ||
49 | AFMT_NUM_CODECS, | 57 | AFMT_NUM_CODECS, |
50 | 58 | ||
51 | #if CONFIG_CODEC == SWCODEC | 59 | #if CONFIG_CODEC == SWCODEC && defined(HAVE_RECORDING) |
52 | /* masks to decompose parts */ | 60 | /* masks to decompose parts */ |
53 | CODEC_AFMT_MASK = 0x0fff, | 61 | CODEC_AFMT_MASK = 0x0fff, |
54 | CODEC_TYPE_MASK = 0x7000, | 62 | CODEC_TYPE_MASK = 0x7000, |
55 | 63 | ||
56 | /* switch for specifying codec type when requesting a filename */ | 64 | /* switch for specifying codec type when requesting a filename */ |
57 | CODEC_TYPE_DECODER = (0 << 12), /* default */ | 65 | CODEC_TYPE_DECODER = (0 << 12), /* default */ |
58 | CODEC_TYPE_ENCODER = (1 << 12) | 66 | CODEC_TYPE_ENCODER = (1 << 12), |
59 | #endif | 67 | #endif /* CONFIG_CODEC == SWCODEC && defined(HAVE_RECORDING) */ |
60 | }; | 68 | }; |
61 | 69 | ||
62 | #if CONFIG_CODEC == SWCODEC | 70 | #if CONFIG_CODEC == SWCODEC |
63 | #define AFMT_ENTRY(label, codec_fname, codec_enc_fname, enc_ext) \ | 71 | #define CODEC_EXTENSION "codec" |
64 | { label, codec_fname, codec_enc_fname, enc_ext } | 72 | |
65 | #else | 73 | #ifdef HAVE_RECORDING |
66 | #define AFMT_ENTRY(label, codec_fname, codec_enc_fname, enc_ext) \ | 74 | #define ENCODER_SUFFIX "_enc" |
67 | { label } | 75 | enum rec_format_indexes |
68 | #endif | 76 | { |
77 | __REC_FORMAT_START_INDEX = -1, | ||
78 | |||
79 | /* start formats */ | ||
80 | |||
81 | REC_FORMAT_PCM_WAV, | ||
82 | REC_FORMAT_WAVPACK, | ||
83 | REC_FORMAT_MPA_L3, | ||
84 | |||
85 | /* add new formats at any index above this line to have a sensible order - | ||
86 | specified array index inits are used | ||
87 | REC_FORMAT_CFG_NUM_BITS should allocate enough bits to hold the range | ||
88 | REC_FORMAT_CFG_VALUE_LIST should be in same order as indexes | ||
89 | */ | ||
90 | |||
91 | REC_NUM_FORMATS, | ||
92 | |||
93 | REC_FORMAT_DEFAULT = REC_FORMAT_PCM_WAV, | ||
94 | REC_FORMAT_CFG_NUM_BITS = 2 | ||
95 | }; | ||
96 | |||
97 | #define REC_FORMAT_CFG_VAL_LIST "wave,wvpk,mpa3" | ||
98 | |||
99 | /* get REC_FORMAT_* corresponding AFMT_* */ | ||
100 | extern const int rec_format_afmt[REC_NUM_FORMATS]; | ||
101 | /* get AFMT_* corresponding REC_FORMAT_* */ | ||
102 | extern const int afmt_rec_format[AFMT_NUM_CODECS]; | ||
103 | |||
104 | #define AFMT_ENTRY(label, root_fname, enc_root_fname, ext_list) \ | ||
105 | { label, root_fname, enc_root_fname, ext_list } | ||
106 | #else /* !HAVE_RECORDING */ | ||
107 | #define AFMT_ENTRY(label, root_fname, enc_root_fname, ext_list) \ | ||
108 | { label, root_fname, ext_list } | ||
109 | #endif /* HAVE_RECORDING */ | ||
110 | #else /* !SWCODEC */ | ||
111 | |||
112 | #define AFMT_ENTRY(label, root_fname, enc_root_fname, ext_list) \ | ||
113 | { label, ext_list } | ||
114 | #endif /* CONFIG_CODEC == SWCODEC */ | ||
69 | 115 | ||
70 | /* record describing the audio format */ | 116 | /* record describing the audio format */ |
71 | struct afmt_entry | 117 | struct afmt_entry |
72 | { | 118 | { |
73 | #if CONFIG_CODEC == SWCODEC | ||
74 | char label[8]; /* format label */ | 119 | char label[8]; /* format label */ |
75 | char *codec_fn; /* filename of decoder codec */ | 120 | #if CONFIG_CODEC == SWCODEC |
76 | char *codec_enc_fn; /* filename of encoder codec */ | 121 | char *codec_root_fn; /* root codec filename (sans _enc and .codec) */ |
77 | char *ext; /* default extension for file (enc only for now) */ | 122 | #ifdef HAVE_RECORDING |
78 | #else | 123 | char *codec_enc_root_fn; /* filename of encoder codec */ |
79 | char label[4]; | 124 | #endif |
80 | #endif | 125 | #endif |
126 | char *ext_list; /* double NULL terminated extension | ||
127 | list for type with the first as | ||
128 | the default for recording */ | ||
81 | }; | 129 | }; |
82 | 130 | ||
83 | /* database of labels and codecs. add formats per above enum */ | 131 | /* database of labels and codecs. add formats per above enum */ |
84 | extern const struct afmt_entry audio_formats[AFMT_NUM_CODECS]; | 132 | extern const struct afmt_entry audio_formats[AFMT_NUM_CODECS]; |
85 | 133 | ||
86 | #if CONFIG_CODEC == SWCODEC | ||
87 | /* recording quality to AFMT_* */ | ||
88 | extern const int rec_quality_info_afmt[9]; | ||
89 | #endif | ||
90 | |||
91 | struct mp3entry { | 134 | struct mp3entry { |
92 | char path[MAX_PATH]; | 135 | char path[MAX_PATH]; |
93 | char* title; | 136 | char* title; |
diff --git a/firmware/export/pcm_playback.h b/firmware/export/pcm_playback.h index a4cd93969b..9c3e96ba63 100644 --- a/firmware/export/pcm_playback.h +++ b/firmware/export/pcm_playback.h | |||
@@ -19,11 +19,23 @@ | |||
19 | #ifndef PCM_PLAYBACK_H | 19 | #ifndef PCM_PLAYBACK_H |
20 | #define PCM_PLAYBACK_H | 20 | #define PCM_PLAYBACK_H |
21 | 21 | ||
22 | #include <sys/types.h> | ||
23 | |||
24 | /* Typedef for registered callback (play and record) */ | ||
25 | typedef void (*pcm_more_callback_type)(unsigned char **start, | ||
26 | size_t *size); | ||
27 | |||
22 | void pcm_init(void); | 28 | void pcm_init(void); |
29 | |||
30 | /* set the pcm frequency - use values in hw_sampr_list | ||
31 | * use -1 for the default frequency | ||
32 | */ | ||
23 | void pcm_set_frequency(unsigned int frequency); | 33 | void pcm_set_frequency(unsigned int frequency); |
34 | /* apply settings to hardware immediately */ | ||
35 | void pcm_apply_settings(bool reset); | ||
24 | 36 | ||
25 | /* This is for playing "raw" PCM data */ | 37 | /* This is for playing "raw" PCM data */ |
26 | void pcm_play_data(void (*get_more)(unsigned char** start, size_t* size), | 38 | void pcm_play_data(pcm_more_callback_type get_more, |
27 | unsigned char* start, size_t size); | 39 | unsigned char* start, size_t size); |
28 | 40 | ||
29 | void pcm_calculate_peaks(int *left, int *right); | 41 | void pcm_calculate_peaks(int *left, int *right); |
@@ -35,4 +47,4 @@ void pcm_play_pause(bool play); | |||
35 | bool pcm_is_paused(void); | 47 | bool pcm_is_paused(void); |
36 | bool pcm_is_playing(void); | 48 | bool pcm_is_playing(void); |
37 | 49 | ||
38 | #endif | 50 | #endif /* PCM_PLAYBACK_H */ |
diff --git a/firmware/export/pcm_record.h b/firmware/export/pcm_record.h index b217335340..c1187a4c6c 100644 --- a/firmware/export/pcm_record.h +++ b/firmware/export/pcm_record.h | |||
@@ -20,24 +20,44 @@ | |||
20 | #ifndef PCM_RECORD_H | 20 | #ifndef PCM_RECORD_H |
21 | #define PCM_RECORD_H | 21 | #define PCM_RECORD_H |
22 | 22 | ||
23 | void enc_set_parameters(int chunk_size, int num_chunks, | 23 | #define DMA_REC_ERROR_DMA ((size_t)-1) |
24 | int samp_per_chunk, char *head_ptr, int head_size, | 24 | #ifdef HAVE_SPDIF_IN |
25 | int enc_id); | 25 | #define DMA_REC_ERROR_SPDIF ((size_t)-2) |
26 | void enc_get_inputs(int *buffer_size, int *channels, int *quality); | 26 | #endif |
27 | unsigned int* enc_alloc_chunk(void); | 27 | /* Use AUDIO_SRC_* enumeration values */ |
28 | void enc_free_chunk(void); | 28 | void pcm_set_monitor(int monitor); |
29 | int enc_wavbuf_near_empty(void); | 29 | void pcm_set_rec_source(int source); |
30 | char* enc_get_wav_data(int size); | 30 | |
31 | extern void (*enc_set_header_callback)(void *head_buffer, int head_size, | 31 | /** |
32 | int num_pcm_samples, bool is_file_header); | 32 | * RAW pcm data recording |
33 | * These calls are nescessary only when using the raw pcm apis directly. | ||
34 | */ | ||
35 | |||
36 | /* Initialize pcm recording interface */ | ||
37 | void pcm_init_recording(void); | ||
38 | /* Uninitialze pcm recording interface */ | ||
39 | void pcm_close_recording(void); | ||
40 | |||
41 | /* Start recording "raw" PCM data */ | ||
42 | void pcm_record_data(pcm_more_callback_type more_ready, | ||
43 | unsigned char *start, size_t size); | ||
33 | 44 | ||
45 | /* Stop tranferring data into supplied buffer */ | ||
46 | void pcm_stop_recording(void); | ||
47 | |||
48 | void pcm_calculate_rec_peaks(int *left, int *right); | ||
49 | |||
50 | /** General functions for high level codec recording **/ | ||
51 | void pcm_rec_error_clear(void); | ||
34 | unsigned long pcm_rec_status(void); | 52 | unsigned long pcm_rec_status(void); |
35 | void pcm_rec_init(void); | 53 | void pcm_rec_init(void); |
36 | void pcm_rec_mux(int source); | 54 | void pcm_rec_mux(int source); |
37 | int pcm_rec_current_bitrate(void); | 55 | int pcm_rec_current_bitrate(void); |
56 | int pcm_rec_encoder_afmt(void); /* AFMT_* value, AFMT_UNKNOWN if none */ | ||
57 | int pcm_rec_rec_format(void); /* Format index or -1 otherwise */ | ||
58 | unsigned long pcm_rec_sample_rate(void); | ||
38 | int pcm_get_num_unprocessed(void); | 59 | int pcm_get_num_unprocessed(void); |
39 | void pcm_rec_get_peaks(int *left, int *right); | ||
40 | 60 | ||
41 | /* audio.h contains audio recording functions */ | 61 | /* audio.h contains audio_* recording functions */ |
42 | 62 | ||
43 | #endif | 63 | #endif /* PCM_RECORD_H */ |
diff --git a/firmware/export/system.h b/firmware/export/system.h index 4a33d80466..9b90a6e80c 100644 --- a/firmware/export/system.h +++ b/firmware/export/system.h | |||
@@ -21,7 +21,6 @@ | |||
21 | #define __SYSTEM_H__ | 21 | #define __SYSTEM_H__ |
22 | 22 | ||
23 | #include "cpu.h" | 23 | #include "cpu.h" |
24 | #include "config.h" | ||
25 | #include "stdbool.h" | 24 | #include "stdbool.h" |
26 | 25 | ||
27 | extern void system_reboot (void); | 26 | extern void system_reboot (void); |
@@ -111,6 +110,23 @@ const char *get_cpu_boost_tracker(void); | |||
111 | #define MAX(a, b) (((a)>(b))?(a):(b)) | 110 | #define MAX(a, b) (((a)>(b))?(a):(b)) |
112 | #endif | 111 | #endif |
113 | 112 | ||
113 | /* return number of elements in array a */ | ||
114 | #define ARRAYLEN(a) (sizeof(a)/sizeof((a)[0])) | ||
115 | |||
116 | /* return p incremented by specified number of bytes */ | ||
117 | #define SKIPBYTES(p, count) ((typeof (p))((char *)(p) + (count))) | ||
118 | |||
119 | #define P2_M1(p2) ((1 << (p2))-1) | ||
120 | |||
121 | /* align up or down to nearest 2^p2 */ | ||
122 | #define ALIGN_DOWN_P2(n, p2) ((n) & ~P2_M1(p2)) | ||
123 | #define ALIGN_UP_P2(n, p2) ALIGN_DOWN_P2((n) + P2_M1(p2),p2) | ||
124 | |||
125 | /* align up or down to nearest integer multiple of a */ | ||
126 | #define ALIGN_DOWN(n, a) ((n)/(a)*(a)) | ||
127 | #define ALIGN_UP(n, a) ALIGN_DOWN((n)+((a)-1),a) | ||
128 | |||
129 | /* live endianness conversion */ | ||
114 | #ifdef ROCKBOX_LITTLE_ENDIAN | 130 | #ifdef ROCKBOX_LITTLE_ENDIAN |
115 | #define letoh16(x) (x) | 131 | #define letoh16(x) (x) |
116 | #define letoh32(x) (x) | 132 | #define letoh32(x) (x) |
@@ -120,6 +136,8 @@ const char *get_cpu_boost_tracker(void); | |||
120 | #define betoh32(x) swap32(x) | 136 | #define betoh32(x) swap32(x) |
121 | #define htobe16(x) swap16(x) | 137 | #define htobe16(x) swap16(x) |
122 | #define htobe32(x) swap32(x) | 138 | #define htobe32(x) swap32(x) |
139 | #define swap_odd_even_be32(x) (x) | ||
140 | #define swap_odd_even_le32(x) swap_odd_even32(x) | ||
123 | #else | 141 | #else |
124 | #define letoh16(x) swap16(x) | 142 | #define letoh16(x) swap16(x) |
125 | #define letoh32(x) swap32(x) | 143 | #define letoh32(x) swap32(x) |
@@ -129,6 +147,37 @@ const char *get_cpu_boost_tracker(void); | |||
129 | #define betoh32(x) (x) | 147 | #define betoh32(x) (x) |
130 | #define htobe16(x) (x) | 148 | #define htobe16(x) (x) |
131 | #define htobe32(x) (x) | 149 | #define htobe32(x) (x) |
150 | #define swap_odd_even_be32(x) swap_odd_even32(x) | ||
151 | #define swap_odd_even_le32(x) (x) | ||
152 | #endif | ||
153 | |||
154 | /* static endianness conversion */ | ||
155 | #define SWAP_16(x) ((typeof(x))(unsigned short)(((unsigned short)(x) >> 8) | \ | ||
156 | ((unsigned short)(x) << 8))) | ||
157 | |||
158 | #define SWAP_32(x) ((typeof(x))(unsigned long)( ((unsigned long)(x) >> 24) | \ | ||
159 | (((unsigned long)(x) & 0xff0000ul) >> 8) | \ | ||
160 | (((unsigned long)(x) & 0xff00ul) << 8) | \ | ||
161 | ((unsigned long)(x) << 24))) | ||
162 | |||
163 | #ifdef ROCKBOX_LITTLE_ENDIAN | ||
164 | #define LE_TO_H16(x) (x) | ||
165 | #define LE_TO_H32(x) (x) | ||
166 | #define H_TO_LE16(x) (x) | ||
167 | #define H_TO_LE32(x) (x) | ||
168 | #define BE_TO_H16(x) SWAP_16(x) | ||
169 | #define BE_TO_H32(x) SWAP_32(x) | ||
170 | #define H_TO_BE16(x) SWAP_16(x) | ||
171 | #define H_TO_BE32(x) SWAP_32(x) | ||
172 | #else | ||
173 | #define LE_TO_H16(x) SWAP_16(x) | ||
174 | #define LE_TO_H32(x) SWAP_32(x) | ||
175 | #define H_TO_LE16(x) SWAP_16(x) | ||
176 | #define H_TO_LE32(x) SWAP_32(x) | ||
177 | #define BE_TO_H16(x) (x) | ||
178 | #define BE_TO_H32(x) (x) | ||
179 | #define H_TO_BE16(x) (x) | ||
180 | #define H_TO_BE32(x) (x) | ||
132 | #endif | 181 | #endif |
133 | 182 | ||
134 | 183 | ||
@@ -181,6 +230,7 @@ enum { | |||
181 | : /* %0 */ I_CONSTRAINT((char)(mask)), \ | 230 | : /* %0 */ I_CONSTRAINT((char)(mask)), \ |
182 | /* %1 */ "z"(address-GBR)) | 231 | /* %1 */ "z"(address-GBR)) |
183 | 232 | ||
233 | |||
184 | #endif /* CONFIG_CPU == SH7034 */ | 234 | #endif /* CONFIG_CPU == SH7034 */ |
185 | 235 | ||
186 | #ifndef SIMULATOR | 236 | #ifndef SIMULATOR |
@@ -388,7 +438,20 @@ static inline unsigned long swap32(unsigned long value) | |||
388 | #define invalidate_icache() | 438 | #define invalidate_icache() |
389 | 439 | ||
390 | #endif | 440 | #endif |
391 | #else | 441 | |
442 | #ifndef CPU_COLDFIRE | ||
443 | static inline unsigned long swap_odd_even32(unsigned long value) | ||
444 | { | ||
445 | /* | ||
446 | result[31..24],[15.. 8] = value[23..16],[ 7.. 0] | ||
447 | result[23..16],[ 7.. 0] = value[31..24],[15.. 8] | ||
448 | */ | ||
449 | unsigned long t = value & 0xff00ff00; | ||
450 | return (t >> 8) | ((t ^ value) << 8); | ||
451 | } | ||
452 | #endif | ||
453 | |||
454 | #else /* SIMULATOR */ | ||
392 | 455 | ||
393 | static inline unsigned short swap16(unsigned short value) | 456 | static inline unsigned short swap16(unsigned short value) |
394 | /* | 457 | /* |
@@ -412,8 +475,18 @@ static inline unsigned long swap32(unsigned long value) | |||
412 | return (lo << 16) | hi; | 475 | return (lo << 16) | hi; |
413 | } | 476 | } |
414 | 477 | ||
478 | static inline unsigned long swap_odd_even32(unsigned long value) | ||
479 | { | ||
480 | /* | ||
481 | result[31..24],[15.. 8] = value[23..16],[ 7.. 0] | ||
482 | result[23..16],[ 7.. 0] = value[31..24],[15.. 8] | ||
483 | */ | ||
484 | unsigned long t = value & 0xff00ff00; | ||
485 | return (t >> 8) | ((t ^ value) << 8); | ||
486 | } | ||
487 | |||
415 | #define invalidate_icache() | 488 | #define invalidate_icache() |
416 | 489 | ||
417 | #endif | 490 | #endif /* !SIMULATOR */ |
418 | 491 | ||
419 | #endif | 492 | #endif /* __SYSTEM_H__ */ |
diff --git a/firmware/export/thread.h b/firmware/export/thread.h index 17e6e3aa88..72c692ec3b 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); | |||
142 | void sleep_thread(int ticks); | 142 | void sleep_thread(int ticks); |
143 | void block_thread(struct thread_entry **thread, int timeout); | 143 | void block_thread(struct thread_entry **thread, int timeout); |
144 | void wakeup_thread(struct thread_entry **thread); | 144 | void wakeup_thread(struct thread_entry **thread); |
145 | #ifdef HAVE_PRIORITY_SCHEDULING | ||
145 | int thread_set_priority(struct thread_entry *thread, int priority); | 146 | int thread_set_priority(struct thread_entry *thread, int priority); |
147 | int thread_get_priority(struct thread_entry *thread); | ||
148 | #endif | ||
146 | void init_threads(void); | 149 | void init_threads(void); |
147 | int thread_stack_usage(const struct thread_entry *thread); | 150 | int thread_stack_usage(const struct thread_entry *thread); |
148 | int thread_get_status(const struct thread_entry *thread); | 151 | int thread_get_status(const struct thread_entry *thread); |
diff --git a/firmware/export/tlv320.h b/firmware/export/tlv320.h index dfcbec4373..023ec9d874 100644 --- a/firmware/export/tlv320.h +++ b/firmware/export/tlv320.h | |||
@@ -24,6 +24,16 @@ | |||
24 | 24 | ||
25 | extern void tlv320_init(void); | 25 | extern void tlv320_init(void); |
26 | extern void tlv320_reset(void); | 26 | extern void tlv320_reset(void); |
27 | /** | ||
28 | * Sets internal sample rate for DAC and ADC relative to MCLK | ||
29 | * Selection for frequency: | ||
30 | * Fs: tlv: with: | ||
31 | * 11025: 0 = MCLK/2 MCLK/2 SCLK, LRCK: Audio Clk / 16 | ||
32 | * 22050: 0 = MCLK/2 MCLK SCLK, LRCK: Audio Clk / 8 | ||
33 | * 44100: 1 = MCLK MCLK SCLK, LRCK: Audio Clk / 4 (default) | ||
34 | * 88200: 2 = MCLK*2 MCLK SCLK, LRCK: Audio Clk / 2 | ||
35 | */ | ||
36 | extern void tlv320_set_frequency(unsigned fsel); | ||
27 | extern void tlv320_enable_output(bool enable); | 37 | extern void tlv320_enable_output(bool enable); |
28 | extern void tlv320_set_headphone_vol(int vol_l, int vol_r); | 38 | extern void tlv320_set_headphone_vol(int vol_l, int vol_r); |
29 | extern void tlv320_set_recvol(int left, int right, int type); | 39 | extern void tlv320_set_recvol(int left, int right, int type); |
diff --git a/firmware/export/uda1380.h b/firmware/export/uda1380.h index 9c761c6a7d..639ca8aa5c 100644 --- a/firmware/export/uda1380.h +++ b/firmware/export/uda1380.h | |||
@@ -28,8 +28,17 @@ extern void uda1380_set_bass(int value); | |||
28 | extern void uda1380_set_treble(int value); | 28 | extern void uda1380_set_treble(int value); |
29 | extern int uda1380_mute(int mute); | 29 | extern int uda1380_mute(int mute); |
30 | extern void uda1380_close(void); | 30 | extern void uda1380_close(void); |
31 | extern void uda1380_set_nsorder(int order); | 31 | /** |
32 | 32 | * Sets frequency settings for DAC and ADC relative to MCLK | |
33 | * | ||
34 | * Selection for frequency ranges: | ||
35 | * Fs: range: with: | ||
36 | * 11025: 0 = 6.25 to 12.5 SCLK, LRCK: Audio Clk / 16 | ||
37 | * 22050: 1 = 12.5 to 25 SCLK, LRCK: Audio Clk / 8 | ||
38 | * 44100: 2 = 25 to 50 SCLK, LRCK: Audio Clk / 4 (default) | ||
39 | * 88200: 3 = 50 to 100 SCLK, LRCK: Audio Clk / 2 | ||
40 | */ | ||
41 | extern void uda1380_set_frequency(unsigned fsel); | ||
33 | extern void uda1380_enable_recording(bool source_mic); | 42 | extern void uda1380_enable_recording(bool source_mic); |
34 | extern void uda1380_disable_recording(void); | 43 | extern void uda1380_disable_recording(void); |
35 | extern void uda1380_set_recvol(int left, int right, int type); | 44 | extern void uda1380_set_recvol(int left, int right, int type); |