diff options
Diffstat (limited to 'lib/rbcodec/dsp/dsp_sample_output.c')
-rw-r--r-- | lib/rbcodec/dsp/dsp_sample_output.c | 33 |
1 files changed, 16 insertions, 17 deletions
diff --git a/lib/rbcodec/dsp/dsp_sample_output.c b/lib/rbcodec/dsp/dsp_sample_output.c index 4a8050b082..d57d236cbb 100644 --- a/lib/rbcodec/dsp/dsp_sample_output.c +++ b/lib/rbcodec/dsp/dsp_sample_output.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include "system.h" | 23 | #include "system.h" |
24 | #include "dsp_core.h" | 24 | #include "dsp_core.h" |
25 | #include "dsp_sample_io.h" | 25 | #include "dsp_sample_io.h" |
26 | #include "dsp_proc_entry.h" | ||
26 | #include "dsp-util.h" | 27 | #include "dsp-util.h" |
27 | #include <string.h> | 28 | #include <string.h> |
28 | 29 | ||
@@ -159,9 +160,8 @@ void sample_output_dithered(struct sample_io_data *this, | |||
159 | } | 160 | } |
160 | 161 | ||
161 | /* Initialize the output function for settings and format */ | 162 | /* Initialize the output function for settings and format */ |
162 | static void dsp_sample_output_format_change(struct sample_io_data *this, | 163 | void dsp_sample_output_format_change(struct sample_io_data *this, |
163 | struct dsp_buffer *src, | 164 | struct sample_format *format) |
164 | struct dsp_buffer *dst) | ||
165 | { | 165 | { |
166 | static const sample_output_fn_type fns[2][2] = | 166 | static const sample_output_fn_type fns[2][2] = |
167 | { | 167 | { |
@@ -171,25 +171,20 @@ static void dsp_sample_output_format_change(struct sample_io_data *this, | |||
171 | sample_output_dithered }, | 171 | sample_output_dithered }, |
172 | }; | 172 | }; |
173 | 173 | ||
174 | struct sample_format *format = &src->format; | ||
175 | bool dither = dsp_get_id((void *)this) == CODEC_IDX_AUDIO && | 174 | bool dither = dsp_get_id((void *)this) == CODEC_IDX_AUDIO && |
176 | dither_data.enabled; | 175 | dither_data.enabled; |
177 | int channels = format->num_channels; | 176 | int channels = format->num_channels; |
178 | 177 | ||
179 | DSP_PRINT_FORMAT(DSP Output, -1, *format); | 178 | DSP_PRINT_FORMAT(DSP Output, *format); |
180 | 179 | ||
181 | this->output_samples[0] = fns[dither ? 1 : 0][channels - 1]; | 180 | this->output_samples = fns[dither ? 1 : 0][channels - 1]; |
182 | format_change_ack(format); /* always ack, we're last */ | 181 | this->output_version = format->version; |
183 | |||
184 | /* The real function mustn't be called with no data */ | ||
185 | if (this->outcount > 0) | ||
186 | this->output_samples[0](this, src, dst); | ||
187 | } | 182 | } |
188 | 183 | ||
189 | void dsp_sample_output_init(struct sample_io_data *this) | 184 | void INIT_ATTR dsp_sample_output_init(struct sample_io_data *this) |
190 | { | 185 | { |
191 | this->output_samples[0] = sample_output_stereo; | 186 | this->output_version = 0; |
192 | this->output_samples[1] = dsp_sample_output_format_change; | 187 | this->output_samples = sample_output_stereo; |
193 | } | 188 | } |
194 | 189 | ||
195 | /* Flush the dither history */ | 190 | /* Flush the dither history */ |
@@ -199,6 +194,7 @@ void dsp_sample_output_flush(struct sample_io_data *this) | |||
199 | memset(dither_data.state, 0, sizeof (dither_data.state)); | 194 | memset(dither_data.state, 0, sizeof (dither_data.state)); |
200 | } | 195 | } |
201 | 196 | ||
197 | |||
202 | /** Output settings **/ | 198 | /** Output settings **/ |
203 | 199 | ||
204 | /* Set the tri-pdf dithered output */ | 200 | /* Set the tri-pdf dithered output */ |
@@ -207,8 +203,11 @@ void dsp_dither_enable(bool enable) | |||
207 | if (enable == dither_data.enabled) | 203 | if (enable == dither_data.enabled) |
208 | return; | 204 | return; |
209 | 205 | ||
210 | struct sample_io_data *data = (void *)dsp_get_config(CODEC_IDX_AUDIO); | ||
211 | dsp_sample_output_flush(data); | ||
212 | dither_data.enabled = enable; | 206 | dither_data.enabled = enable; |
213 | data->output_samples[0] = dsp_sample_output_format_change; | 207 | struct sample_io_data *data = (void *)dsp_get_config(CODEC_IDX_AUDIO); |
208 | |||
209 | if (enable) | ||
210 | dsp_sample_output_flush(data); | ||
211 | |||
212 | data->output_version = 0; /* Force format update */ | ||
214 | } | 213 | } |