bool AudioProcessor::Reset(int sample_rate, int num_channels) { if (num_channels <= 0) { DEBUG("chromaprint::AudioProcessor::Reset() -- No audio channels."); return false; } if (sample_rate <= kMinSampleRate) { DEBUG("chromaprint::AudioProcessor::Reset() -- Sample rate less than " << kMinSampleRate << " (" << sample_rate << ")."); return false; } m_buffer_offset = 0; if (m_resample_ctx) { av_resample_close(m_resample_ctx); m_resample_ctx = 0; } if (sample_rate != m_target_sample_rate) { m_resample_ctx = av_resample_init( m_target_sample_rate, sample_rate, kResampleFilterLength, kResamplePhaseShift, kResampleLinear, kResampleCutoff); } m_num_channels = num_channels; return true; }
void CFfAudioResample::Destroy() {_STT(); if ( m_ctx ) av_resample_close( m_ctx ), m_ctx = 0; m_nInRate = 0; m_nOutRate = 0; }
// Deallocate memory static void uninit(struct af_instance_s* af) { if(af->data) free(af->data->audio); free(af->data); if(af->setup){ int i; af_resample_t *s = af->setup; if(s->avrctx) av_resample_close(s->avrctx); for (i=0; i < AF_NCH; i++) free(s->in[i]); free(s); } }
// Initialization and runtime control static int control(struct af_instance_s* af, int cmd, void* arg) { af_resample_t* s = (af_resample_t*)af->setup; af_data_t *data= (af_data_t*)arg; int out_rate, test_output_res; // helpers for checking input format switch(cmd){ case AF_CONTROL_REINIT: if((af->data->rate == data->rate) || (af->data->rate == 0)) return AF_DETACH; af->data->nch = data->nch; if (af->data->nch > AF_NCH) af->data->nch = AF_NCH; af->data->format = AF_FORMAT_S16_NE; af->data->bps = 2; af->mul = (double)af->data->rate / data->rate; af->delay = af->data->nch * s->filter_length / min(af->mul, 1); // *bps*.5 if (s->ctx_out_rate != af->data->rate || s->ctx_in_rate != data->rate || s->ctx_filter_size != s->filter_length || s->ctx_phase_shift != s->phase_shift || s->ctx_linear != s->linear || s->ctx_cutoff != s->cutoff) { if(s->avrctx) av_resample_close(s->avrctx); s->avrctx= av_resample_init(af->data->rate, /*in_rate*/data->rate, s->filter_length, s->phase_shift, s->linear, s->cutoff); s->ctx_out_rate = af->data->rate; s->ctx_in_rate = data->rate; s->ctx_filter_size = s->filter_length; s->ctx_phase_shift = s->phase_shift; s->ctx_linear = s->linear; s->ctx_cutoff = s->cutoff; } // hack to make af_test_output ignore the samplerate change out_rate = af->data->rate; af->data->rate = data->rate; test_output_res = af_test_output(af, (af_data_t*)arg); af->data->rate = out_rate; return test_output_res; case AF_CONTROL_COMMAND_LINE:{ s->cutoff= 0.0; sscanf((char*)arg,"%d:%d:%d:%d:%lf", &af->data->rate, &s->filter_length, &s->linear, &s->phase_shift, &s->cutoff); if(s->cutoff <= 0.0) s->cutoff= max(1.0 - 6.5/(s->filter_length+8), 0.80); return AF_OK; } case AF_CONTROL_RESAMPLE_RATE | AF_CONTROL_SET: af->data->rate = *(int*)arg; return AF_OK; } return AF_UNKNOWN; }
static av_cold void uninit(AVFilterContext *ctx) { AResampleContext *aresample = ctx->priv; if (aresample->outsamplesref) { int nb_channels = av_get_channel_layout_nb_channels( aresample->outsamplesref->audio->channel_layout); avfilter_unref_buffer(aresample->outsamplesref); while (nb_channels--) { av_freep(&(aresample->cached_data[nb_channels])); av_freep(&(aresample->resampled_data[nb_channels])); } } if (aresample->resample) av_resample_close(aresample->resample); }
void BE_ST_ShutdownAudio(void) { if (g_sdlAudioSubsystemUp) { if ((g_sdlAudioSpec.callback == BEL_ST_Resampling_EmuCallBack) || (g_sdlAudioSpec.callback == BEL_ST_Resampling_DigiCallBack)) { #ifndef REFKEEN_RESAMPLER_NONE if (g_refKeenCfg.useResampler) { #if (defined REFKEEN_RESAMPLER_LIBSWRESAMPLE) swr_free(&g_sdlSwrContext); #elif (defined REFKEEN_RESAMPLER_LIBAVRESAMPLE) avresample_free(&g_sdlAvAudioResampleContext); #elif (defined REFKEEN_RESAMPLER_LIBAVCODEC) av_resample_close(g_sdlAvResampleContext); #elif (defined REFKEEN_RESAMPLER_LIBRESAMPLE) resample_close(g_sdlResampleHandle); #elif (defined REFKEEN_RESAMPLER_LIBSOXR) soxr_delete(g_sdlSoxr); #elif (defined REFKEEN_RESAMPLER_LIBSPEEXDSP) speex_resampler_destroy(g_sdlSpeexResamplerState); #elif (defined REFKEEN_RESAMPLER_LIBSAMPLERATE) src_delete(g_sdlSrcResampler); #endif } else #endif // REFKEEN_RESAMPLER_NONE { free(g_sdlSampleRateConvTable); } } #ifdef REFKEEN_CONFIG_THREADS SDL_DestroyMutex(g_sdlCallbackMutex); g_sdlCallbackMutex = NULL; #endif SDL_CloseAudio(); SDL_QuitSubSystem(SDL_INIT_AUDIO); g_sdlAudioSubsystemUp = false; } g_sdlCallbackSDFuncPtr = 0; // Just in case this may be called after the audio subsystem was never really started (manual calls to callback) }
AudioProcessor::~AudioProcessor() { if (m_resample_ctx) { av_resample_close(m_resample_ctx); } }