diff --git a/ffplay.c b/ffplay.c index 8ccb815dcb..993ee52c49 100644 --- a/ffplay.c +++ b/ffplay.c @@ -2242,7 +2242,7 @@ static void sdl_audio_callback(void *opaque, Uint8 *stream, int len) is->audio_current_pts_drift = is->audio_current_pts - audio_callback_time / 1000000.0; } -static int audio_open(VideoState *is, int64_t channel_layout, int channels, int sample_rate) +static int audio_open(void *opaque, int64_t channel_layout, int channels, int sample_rate, struct AudioParams *audio) { SDL_AudioSpec wanted_spec, spec; const char *env; @@ -2272,7 +2272,7 @@ static int audio_open(VideoState *is, int64_t channel_layout, int channels, int wanted_spec.silence = 0; wanted_spec.samples = SDL_AUDIO_BUFFER_SIZE; wanted_spec.callback = sdl_audio_callback; - wanted_spec.userdata = is; + wanted_spec.userdata = opaque; if (SDL_OpenAudio(&wanted_spec, &spec) < 0) { fprintf(stderr, "SDL_OpenAudio: %s\n", SDL_GetError()); return -1; @@ -2289,12 +2289,11 @@ static int audio_open(VideoState *is, int64_t channel_layout, int channels, int } } - is->audio_hw_buf_size = spec.size; - is->audio_src.fmt = is->audio_tgt.fmt = AV_SAMPLE_FMT_S16; - is->audio_src.freq = is->audio_tgt.freq = spec.freq; - is->audio_src.channel_layout = is->audio_tgt.channel_layout = wanted_channel_layout; - is->audio_src.channels = is->audio_tgt.channels = spec.channels; - return 0; + audio->fmt = AV_SAMPLE_FMT_S16; + audio->freq = spec.freq; + audio->channel_layout = wanted_channel_layout; + audio->channels = spec.channels; + return spec.size; } /* open a given stream. Return 0 if OK */ @@ -2351,8 +2350,11 @@ static int stream_component_open(VideoState *is, int stream_index) /* prepare audio output */ if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) { - if (audio_open(is, avctx->channel_layout, avctx->channels, avctx->sample_rate) < 0) + int audio_hw_buf_size = audio_open(is, avctx->channel_layout, avctx->channels, avctx->sample_rate, &is->audio_src); + if (audio_hw_buf_size < 0) return -1; + is->audio_hw_buf_size = audio_hw_buf_size; + is->audio_tgt = is->audio_src; } ic->streams[stream_index]->discard = AVDISCARD_DEFAULT;