diff mbox

[FFmpeg-devel] ffplay: use SDL2 audio API

Message ID 20171104185430.18383-1-cus@passwd.hu
State Accepted
Commit d68a557df4937b695a5f6a14877d92647be95aaa
Headers show

Commit Message

Marton Balint Nov. 4, 2017, 6:54 p.m. UTC
It allows us to specify what kind of audio parameter changes are allowed.

Should fix ticket #6721.

Signed-off-by: Marton Balint <cus@passwd.hu>
---
 fftools/ffplay.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

Comments

James Almer Nov. 4, 2017, 7:12 p.m. UTC | #1
On 11/4/2017 3:54 PM, Marton Balint wrote:
> It allows us to specify what kind of audio parameter changes are allowed.
> 
> Should fix ticket #6721.

Seems to work. Thanks.

> 
> Signed-off-by: Marton Balint <cus@passwd.hu>
> ---
>  fftools/ffplay.c | 9 +++++----
>  1 file changed, 5 insertions(+), 4 deletions(-)
> 
> diff --git a/fftools/ffplay.c b/fftools/ffplay.c
> index c264e92535..bd1457c7e3 100644
> --- a/fftools/ffplay.c
> +++ b/fftools/ffplay.c
> @@ -362,6 +362,7 @@ static AVPacket flush_pkt;
>  static SDL_Window *window;
>  static SDL_Renderer *renderer;
>  static SDL_RendererInfo renderer_info = {0};
> +static SDL_AudioDeviceID audio_dev;
>  
>  static const struct TextureFormatEntry {
>      enum AVPixelFormat format;
> @@ -1192,7 +1193,7 @@ static void stream_component_close(VideoState *is, int stream_index)
>      switch (codecpar->codec_type) {
>      case AVMEDIA_TYPE_AUDIO:
>          decoder_abort(&is->auddec, &is->sampq);
> -        SDL_CloseAudio();
> +        SDL_CloseAudioDevice(audio_dev);
>          decoder_destroy(&is->auddec);
>          swr_free(&is->swr_ctx);
>          av_freep(&is->audio_buf1);
> @@ -2451,7 +2452,7 @@ static void sdl_audio_callback(void *opaque, Uint8 *stream, int len)
>          else {
>              memset(stream, 0, len1);
>              if (!is->muted && is->audio_buf)
> -                SDL_MixAudio(stream, (uint8_t *)is->audio_buf + is->audio_buf_index, len1, is->audio_volume);
> +                SDL_MixAudioFormat(stream, (uint8_t *)is->audio_buf + is->audio_buf_index, AUDIO_S16SYS, len1, is->audio_volume);
>          }
>          len -= len1;
>          stream += len1;
> @@ -2496,7 +2497,7 @@ static int audio_open(void *opaque, int64_t wanted_channel_layout, int wanted_nb
>      wanted_spec.samples = FFMAX(SDL_AUDIO_MIN_BUFFER_SIZE, 2 << av_log2(wanted_spec.freq / SDL_AUDIO_MAX_CALLBACKS_PER_SEC));
>      wanted_spec.callback = sdl_audio_callback;
>      wanted_spec.userdata = opaque;
> -    while (SDL_OpenAudio(&wanted_spec, &spec) < 0) {
> +    while (!(audio_dev = SDL_OpenAudioDevice(NULL, 0, &wanted_spec, &spec, SDL_AUDIO_ALLOW_FREQUENCY_CHANGE | SDL_AUDIO_ALLOW_CHANNELS_CHANGE))) {
>          av_log(NULL, AV_LOG_WARNING, "SDL_OpenAudio (%d channels, %d Hz): %s\n",
>                 wanted_spec.channels, wanted_spec.freq, SDL_GetError());
>          wanted_spec.channels = next_nb_channels[FFMIN(7, wanted_spec.channels)];
> @@ -2659,7 +2660,7 @@ static int stream_component_open(VideoState *is, int stream_index)
>          }
>          if ((ret = decoder_start(&is->auddec, audio_thread, is)) < 0)
>              goto out;
> -        SDL_PauseAudio(0);
> +        SDL_PauseAudioDevice(audio_dev, 0);
>          break;
>      case AVMEDIA_TYPE_VIDEO:
>          is->video_stream = stream_index;
Marton Balint Nov. 5, 2017, 11:19 p.m. UTC | #2
On Sat, 4 Nov 2017, James Almer wrote:

> On 11/4/2017 3:54 PM, Marton Balint wrote:
>> It allows us to specify what kind of audio parameter changes are allowed.
>> 
>> Should fix ticket #6721.
>
> Seems to work. Thanks.
>

Thanks, applied.

Regards,
Marton
diff mbox

Patch

diff --git a/fftools/ffplay.c b/fftools/ffplay.c
index c264e92535..bd1457c7e3 100644
--- a/fftools/ffplay.c
+++ b/fftools/ffplay.c
@@ -362,6 +362,7 @@  static AVPacket flush_pkt;
 static SDL_Window *window;
 static SDL_Renderer *renderer;
 static SDL_RendererInfo renderer_info = {0};
+static SDL_AudioDeviceID audio_dev;
 
 static const struct TextureFormatEntry {
     enum AVPixelFormat format;
@@ -1192,7 +1193,7 @@  static void stream_component_close(VideoState *is, int stream_index)
     switch (codecpar->codec_type) {
     case AVMEDIA_TYPE_AUDIO:
         decoder_abort(&is->auddec, &is->sampq);
-        SDL_CloseAudio();
+        SDL_CloseAudioDevice(audio_dev);
         decoder_destroy(&is->auddec);
         swr_free(&is->swr_ctx);
         av_freep(&is->audio_buf1);
@@ -2451,7 +2452,7 @@  static void sdl_audio_callback(void *opaque, Uint8 *stream, int len)
         else {
             memset(stream, 0, len1);
             if (!is->muted && is->audio_buf)
-                SDL_MixAudio(stream, (uint8_t *)is->audio_buf + is->audio_buf_index, len1, is->audio_volume);
+                SDL_MixAudioFormat(stream, (uint8_t *)is->audio_buf + is->audio_buf_index, AUDIO_S16SYS, len1, is->audio_volume);
         }
         len -= len1;
         stream += len1;
@@ -2496,7 +2497,7 @@  static int audio_open(void *opaque, int64_t wanted_channel_layout, int wanted_nb
     wanted_spec.samples = FFMAX(SDL_AUDIO_MIN_BUFFER_SIZE, 2 << av_log2(wanted_spec.freq / SDL_AUDIO_MAX_CALLBACKS_PER_SEC));
     wanted_spec.callback = sdl_audio_callback;
     wanted_spec.userdata = opaque;
-    while (SDL_OpenAudio(&wanted_spec, &spec) < 0) {
+    while (!(audio_dev = SDL_OpenAudioDevice(NULL, 0, &wanted_spec, &spec, SDL_AUDIO_ALLOW_FREQUENCY_CHANGE | SDL_AUDIO_ALLOW_CHANNELS_CHANGE))) {
         av_log(NULL, AV_LOG_WARNING, "SDL_OpenAudio (%d channels, %d Hz): %s\n",
                wanted_spec.channels, wanted_spec.freq, SDL_GetError());
         wanted_spec.channels = next_nb_channels[FFMIN(7, wanted_spec.channels)];
@@ -2659,7 +2660,7 @@  static int stream_component_open(VideoState *is, int stream_index)
         }
         if ((ret = decoder_start(&is->auddec, audio_thread, is)) < 0)
             goto out;
-        SDL_PauseAudio(0);
+        SDL_PauseAudioDevice(audio_dev, 0);
         break;
     case AVMEDIA_TYPE_VIDEO:
         is->video_stream = stream_index;