core: avoid using build_afilter_chain() directly

build_afilter_chain is not safe to use directly, thus make it
static and instead use reinit_audio_chain which should have
better error handling.
Fixes a crash with -af hrtf and changing speed, audio will
still stop playing though.

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@32648 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
reimar 2010-11-26 20:52:35 +00:00 committed by Uoti Urpala
parent a9b5a9348d
commit 21df1d5ec5
3 changed files with 9 additions and 9 deletions

View File

@ -263,14 +263,14 @@ static int mp_property_playback_speed(m_option_t *prop, int action,
return M_PROPERTY_ERROR; return M_PROPERTY_ERROR;
M_PROPERTY_CLAMP(prop, *(float *) arg); M_PROPERTY_CLAMP(prop, *(float *) arg);
opts->playback_speed = *(float *) arg; opts->playback_speed = *(float *) arg;
build_afilter_chain(mpctx, mpctx->sh_audio, &ao_data); reinit_audio_chain(mpctx);
return M_PROPERTY_OK; return M_PROPERTY_OK;
case M_PROPERTY_STEP_UP: case M_PROPERTY_STEP_UP:
case M_PROPERTY_STEP_DOWN: case M_PROPERTY_STEP_DOWN:
opts->playback_speed += (arg ? *(float *) arg : 0.1) * opts->playback_speed += (arg ? *(float *) arg : 0.1) *
(action == M_PROPERTY_STEP_DOWN ? -1 : 1); (action == M_PROPERTY_STEP_DOWN ? -1 : 1);
M_PROPERTY_CLAMP(prop, opts->playback_speed); M_PROPERTY_CLAMP(prop, opts->playback_speed);
build_afilter_chain(mpctx, mpctx->sh_audio, &ao_data); reinit_audio_chain(mpctx);
return M_PROPERTY_OK; return M_PROPERTY_OK;
} }
return m_property_float_range(prop, action, arg, &opts->playback_speed); return m_property_float_range(prop, action, arg, &opts->playback_speed);
@ -2821,7 +2821,7 @@ void run_command(MPContext *mpctx, mp_cmd_t *cmd)
case MP_CMD_SPEED_INCR:{ case MP_CMD_SPEED_INCR:{
float v = cmd->args[0].v.f; float v = cmd->args[0].v.f;
opts->playback_speed += v; opts->playback_speed += v;
build_afilter_chain(mpctx, sh_audio, &ao_data); reinit_audio_chain(mpctx);
set_osd_tmsg(OSD_MSG_SPEED, 1, osd_duration, "Speed: x %6.2f", set_osd_tmsg(OSD_MSG_SPEED, 1, osd_duration, "Speed: x %6.2f",
opts->playback_speed); opts->playback_speed);
} break; } break;
@ -2829,7 +2829,7 @@ void run_command(MPContext *mpctx, mp_cmd_t *cmd)
case MP_CMD_SPEED_MULT:{ case MP_CMD_SPEED_MULT:{
float v = cmd->args[0].v.f; float v = cmd->args[0].v.f;
opts->playback_speed *= v; opts->playback_speed *= v;
build_afilter_chain(mpctx, sh_audio, &ao_data); reinit_audio_chain(mpctx);
set_osd_tmsg(OSD_MSG_SPEED, 1, osd_duration, "Speed: x %6.2f", set_osd_tmsg(OSD_MSG_SPEED, 1, osd_duration, "Speed: x %6.2f",
opts->playback_speed); opts->playback_speed);
} break; } break;
@ -2837,7 +2837,7 @@ void run_command(MPContext *mpctx, mp_cmd_t *cmd)
case MP_CMD_SPEED_SET:{ case MP_CMD_SPEED_SET:{
float v = cmd->args[0].v.f; float v = cmd->args[0].v.f;
opts->playback_speed = v; opts->playback_speed = v;
build_afilter_chain(mpctx, sh_audio, &ao_data); reinit_audio_chain(mpctx);
set_osd_tmsg(OSD_MSG_SPEED, 1, osd_duration, "Speed: x %6.2f", set_osd_tmsg(OSD_MSG_SPEED, 1, osd_duration, "Speed: x %6.2f",
opts->playback_speed); opts->playback_speed);
} break; } break;
@ -3513,7 +3513,7 @@ void run_command(MPContext *mpctx, mp_cmd_t *cmd)
else else
af_add(mpctx->mixer.afilter, af_command); af_add(mpctx->mixer.afilter, af_command);
} }
build_afilter_chain(mpctx, sh_audio, &ao_data); reinit_audio_chain(mpctx);
free(af_args); free(af_args);
} }
break; break;
@ -3522,7 +3522,7 @@ void run_command(MPContext *mpctx, mp_cmd_t *cmd)
break; break;
af_uninit(mpctx->mixer.afilter); af_uninit(mpctx->mixer.afilter);
af_init(mpctx->mixer.afilter); af_init(mpctx->mixer.afilter);
build_afilter_chain(mpctx, sh_audio, &ao_data); reinit_audio_chain(mpctx);
break; break;
case MP_CMD_AF_CMDLINE: case MP_CMD_AF_CMDLINE:
if (sh_audio) { if (sh_audio) {

View File

@ -208,7 +208,6 @@ extern int file_filter;
extern int forced_subs_only; extern int forced_subs_only;
struct ao_data; struct ao_data;
int build_afilter_chain(struct MPContext *mpctx, struct sh_audio *sh_audio, struct ao_data *ao_data);
void uninit_player(struct MPContext *mpctx, unsigned int mask); void uninit_player(struct MPContext *mpctx, unsigned int mask);
void reinit_audio_chain(struct MPContext *mpctx); void reinit_audio_chain(struct MPContext *mpctx);
void init_vo_spudec(struct MPContext *mpctx); void init_vo_spudec(struct MPContext *mpctx);

View File

@ -1373,7 +1373,8 @@ static void print_status(struct MPContext *mpctx, double a_pos, bool at_frame)
* \param sh_audio describes the requested input format of the chain. * \param sh_audio describes the requested input format of the chain.
* \param ao_data describes the requested output format of the chain. * \param ao_data describes the requested output format of the chain.
*/ */
int build_afilter_chain(struct MPContext *mpctx, sh_audio_t *sh_audio, ao_data_t *ao_data) static int build_afilter_chain(struct MPContext *mpctx, sh_audio_t *sh_audio,
ao_data_t *ao_data)
{ {
struct MPOpts *opts = &mpctx->opts; struct MPOpts *opts = &mpctx->opts;
int new_srate; int new_srate;