void set_playback_speed(struct MPContext *mpctx, double new_speed) { struct MPOpts *opts = mpctx->opts; // Adjust time until next frame flip for nosound mode mpctx->time_frame *= opts->playback_speed / new_speed; opts->playback_speed = new_speed; if (!mpctx->d_audio) return; if (new_speed > 1.0 && opts->pitch_correction) { if (!af_control_any_rev(mpctx->d_audio->afilter, AF_CONTROL_SET_PLAYBACK_SPEED, &new_speed)) { if (try_filter(mpctx, "scaletempo", "playback-speed", NULL) < 0) return; } } else { if (af_remove_by_label(mpctx->d_audio->afilter, "playback-speed") < 0) return; } recreate_audio_filters(mpctx); }
int reinit_audio_filters(struct MPContext *mpctx) { struct sh_audio *sh_audio = mpctx->sh_audio; if (!sh_audio) return -2; af_uninit(mpctx->sh_audio->afilter); if (af_init(mpctx->sh_audio->afilter) < 0) return -1; if (recreate_audio_filters(mpctx) < 0) return -1; return 0; }
int reinit_audio_filters(struct MPContext *mpctx) { struct dec_audio *d_audio = mpctx->d_audio; if (!d_audio) return 0; af_uninit(mpctx->d_audio->afilter); if (af_init(mpctx->d_audio->afilter) < 0) return -1; if (recreate_audio_filters(mpctx) < 0) return -1; return 1; }
int reinit_audio_filters(struct MPContext *mpctx) { struct ao_chain *ao_c = mpctx->ao_chain; if (!ao_c) return 0; double delay = mp_output_get_measured_total_delay(ao_c->filter); if (recreate_audio_filters(mpctx) < 0) return -1; double ndelay = mp_output_get_measured_total_delay(ao_c->filter); // Only force refresh if the amount of dropped buffered data is going to // cause "issues" for the A/V sync logic. if (mpctx->audio_status == STATUS_PLAYING && delay - ndelay >= 0.2) issue_refresh_seek(mpctx, MPSEEK_EXACT); return 1; }
void reinit_audio_chain(struct MPContext *mpctx) { struct MPOpts *opts = mpctx->opts; init_demux_stream(mpctx, STREAM_AUDIO); if (!mpctx->sh_audio) { uninit_player(mpctx, INITIALIZED_AO); goto no_audio; } if (!(mpctx->initialized_flags & INITIALIZED_ACODEC)) { if (!init_best_audio_codec(mpctx->sh_audio, opts->audio_decoders)) goto init_error; mpctx->initialized_flags |= INITIALIZED_ACODEC; } int ao_srate = opts->force_srate; int ao_format = opts->audio_output_format; struct mp_chmap ao_channels = {0}; if (mpctx->initialized_flags & INITIALIZED_AO) { ao_srate = mpctx->ao->samplerate; ao_format = mpctx->ao->format; ao_channels = mpctx->ao->channels; } else { // Automatic downmix if (mp_chmap_is_stereo(&opts->audio_output_channels) && !mp_chmap_is_stereo(&mpctx->sh_audio->channels)) { mp_chmap_from_channels(&ao_channels, 2); } } // Determine what the filter chain outputs. build_afilter_chain() also // needs this for testing whether playback speed is changed by resampling // or using a special filter. if (!init_audio_filters(mpctx->sh_audio, // preliminary init // input: mpctx->sh_audio->samplerate, // output: &ao_srate, &ao_channels, &ao_format)) { MP_ERR(mpctx, "Error at audio filter chain pre-init!\n"); goto init_error; } if (!(mpctx->initialized_flags & INITIALIZED_AO)) { mpctx->initialized_flags |= INITIALIZED_AO; mp_chmap_remove_useless_channels(&ao_channels, &opts->audio_output_channels); mpctx->ao = ao_init_best(mpctx->global, mpctx->input, mpctx->encode_lavc_ctx, ao_srate, ao_format, ao_channels); struct ao *ao = mpctx->ao; if (!ao) { MP_ERR(mpctx, "Could not open/initialize audio device -> no sound.\n"); goto init_error; } ao->buffer.start = talloc_new(ao); char *s = mp_audio_fmt_to_str(ao->samplerate, &ao->channels, ao->format); MP_INFO(mpctx, "AO: [%s] %s\n", ao->driver->name, s); talloc_free(s); MP_VERBOSE(mpctx, "AO: Description: %s\n", ao->driver->description); update_window_title(mpctx, true); } if (recreate_audio_filters(mpctx) < 0) goto init_error; mpctx->syncing_audio = true; return; init_error: uninit_player(mpctx, INITIALIZED_ACODEC | INITIALIZED_AO); cleanup_demux_stream(mpctx, STREAM_AUDIO); no_audio: mpctx->current_track[STREAM_AUDIO] = NULL; MP_INFO(mpctx, "Audio: no audio\n"); }