pkgsrc-Changes archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

CVS commit: pkgsrc/devel/SDL2



Module Name:    pkgsrc
Committed By:   nia
Date:           Fri May 24 18:13:36 UTC 2019

Modified Files:
        pkgsrc/devel/SDL2: Makefile distinfo options.mk
        pkgsrc/devel/SDL2/patches: patch-src_audio_netbsd_SDL__netbsdaudio.c

Log Message:
SDL2: Audio changes!

SDL_netbsdaudio.c:

* Rework the NetBSD audio driver significantly. Use blocking i/o as
suggested on the SDL bug tracker. Rework the intialization steps
since they were very wrong. All calls to Delay now removed.

* Fixes the horrible stuttering on my system.

* Performance now approximately matches SDL_AUDIODRIVER=dsp. Code
is also closer to SDL_dspaudio.

* Tested with multimedia/mpv, games/etlegacy, emulators/retroarch,
wip/tesseract-game, using SDL audio outputs.

options.mk:

* Add "jack" option, disabled by default.
* Enable ALSA by default on Linux.
* Fix some whitespace problems.

Bump PKGREVISION.


To generate a diff of this commit:
cvs rdiff -u -r1.34 -r1.35 pkgsrc/devel/SDL2/Makefile
cvs rdiff -u -r1.32 -r1.33 pkgsrc/devel/SDL2/distinfo
cvs rdiff -u -r1.10 -r1.11 pkgsrc/devel/SDL2/options.mk
cvs rdiff -u -r1.1 -r1.2 \
    pkgsrc/devel/SDL2/patches/patch-src_audio_netbsd_SDL__netbsdaudio.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: pkgsrc/devel/SDL2/Makefile
diff -u pkgsrc/devel/SDL2/Makefile:1.34 pkgsrc/devel/SDL2/Makefile:1.35
--- pkgsrc/devel/SDL2/Makefile:1.34     Sun Dec 30 14:47:04 2018
+++ pkgsrc/devel/SDL2/Makefile  Fri May 24 18:13:36 2019
@@ -1,7 +1,7 @@
-# $NetBSD: Makefile,v 1.34 2018/12/30 14:47:04 maya Exp $
+# $NetBSD: Makefile,v 1.35 2019/05/24 18:13:36 nia Exp $
 
 DISTNAME=      SDL2-2.0.9
-PKGREVISION=   2
+PKGREVISION=   3
 CATEGORIES=    devel
 MASTER_SITES=  http://www.libsdl.org/release/
 

Index: pkgsrc/devel/SDL2/distinfo
diff -u pkgsrc/devel/SDL2/distinfo:1.32 pkgsrc/devel/SDL2/distinfo:1.33
--- pkgsrc/devel/SDL2/distinfo:1.32     Sun Dec 30 14:47:04 2018
+++ pkgsrc/devel/SDL2/distinfo  Fri May 24 18:13:36 2019
@@ -1,11 +1,11 @@
-$NetBSD: distinfo,v 1.32 2018/12/30 14:47:04 maya Exp $
+$NetBSD: distinfo,v 1.33 2019/05/24 18:13:36 nia Exp $
 
 SHA1 (SDL2-2.0.9.tar.gz) = 4354c6baad9a48486182656a7506abfb63e9bff5
 RMD160 (SDL2-2.0.9.tar.gz) = db2efabf55af41cddf015db0b5213b11ef22b9d0
 SHA512 (SDL2-2.0.9.tar.gz) = a78a4708b2bb5b35a7c7b7501eb3bd60a9aa3bb95a3d84e57763df4a377185e7312a94b66321eef7ca0d17255e4b402fc950e83ef0dbbd08f14ff1194107dc10
 Size (SDL2-2.0.9.tar.gz) = 5246942 bytes
 SHA1 (patch-configure) = 1631314dab18886ea553ee53fac89e16718cacab
-SHA1 (patch-src_audio_netbsd_SDL__netbsdaudio.c) = 7a1f32ea7029f8dc99aecfaead7c68f2fd6cb230
+SHA1 (patch-src_audio_netbsd_SDL__netbsdaudio.c) = a495f5ede3ab1bd01b0703b50081748a0e57f1c4
 SHA1 (patch-src_joystick_bsd_SDL__sysjoystick.c) = 152b5df76a91c7e7acde126b1464fdd464cf1ba2
 SHA1 (patch-src_video_cocoa_SDL__cocoawindow.m) = 1d5ac9c17ceadf668925734b5cad311e26f2fc58
 SHA1 (patch-src_video_x11_SDL__x11opengl.c) = 70b63021c12c52760c0811c673b259844bdfcdc0

Index: pkgsrc/devel/SDL2/options.mk
diff -u pkgsrc/devel/SDL2/options.mk:1.10 pkgsrc/devel/SDL2/options.mk:1.11
--- pkgsrc/devel/SDL2/options.mk:1.10   Mon Dec 24 16:25:30 2018
+++ pkgsrc/devel/SDL2/options.mk        Fri May 24 18:13:36 2019
@@ -1,10 +1,11 @@
-# $NetBSD: options.mk,v 1.10 2018/12/24 16:25:30 nia Exp $
+# $NetBSD: options.mk,v 1.11 2019/05/24 18:13:36 nia Exp $
 
-PKG_OPTIONS_VAR=       PKG_OPTIONS.SDL2
+PKG_OPTIONS_VAR=               PKG_OPTIONS.SDL2
 PKG_OPTIONS_REQUIRED_GROUPS=   gl
-PKG_SUPPORTED_OPTIONS= alsa dbus esound nas oss pulseaudio x11
-PKG_OPTIONS_GROUP.gl=  opengl
-PKG_SUGGESTED_OPTIONS+=        oss
+PKG_SUPPORTED_OPTIONS=         alsa dbus esound nas oss jack pulseaudio x11
+PKG_OPTIONS_GROUP.gl=          opengl
+PKG_SUGGESTED_OPTIONS+=                oss
+PKG_SUGGESTED_OPTIONS.Linux+=  alsa
 
 .if ${OPSYS} != "Darwin"
 PKG_SUGGESTED_OPTIONS+=        x11
@@ -13,7 +14,7 @@ PKG_SUGGESTED_OPTIONS+=       x11
 .include "../../mk/bsd.fast.prefs.mk"
 
 .if !empty(MACHINE_ARCH:M*arm*)
-PKG_OPTIONS_GROUP.gl+= rpi
+PKG_OPTIONS_GROUP.gl+= rpi
 PKG_SUGGESTED_OPTIONS+=        rpi
 .else
 PKG_SUGGESTED_OPTIONS+=        opengl
@@ -39,6 +40,12 @@ CONFIGURE_ARGS+=     --disable-dbus
 CONFIGURE_ARGS+=       --disable-esd
 .endif
 
+.if !empty(PKG_OPTIONS:Mjack)
+.include "../../audio/jack/buildlink3.mk"
+.else
+CONFIGURE_ARGS+=       --disable-jack
+.endif
+
 .if !empty(PKG_OPTIONS:Mnas)
 .include "../../audio/nas/buildlink3.mk"
 .else
@@ -78,10 +85,10 @@ CONFIGURE_ARGS+=    --disable-x11-shared
 
 .if !empty(PKG_OPTIONS:Mrpi)
 LOWER_VENDOR=          raspberry
-SUBST_CLASSES+=                vc                                             
-SUBST_STAGE.vc=                pre-configure                                  
-SUBST_MESSAGE.vc=      Fixing path to VideoCore libraries.                    
-SUBST_FILES.vc=                configure                                      
+SUBST_CLASSES+=                vc
+SUBST_STAGE.vc=                pre-configure
+SUBST_MESSAGE.vc=      Fixing path to VideoCore libraries.
+SUBST_FILES.vc=                configure
 SUBST_SED.vc+=         -e "s;/opt/vc;${PREFIX};g"
 .include "../../misc/raspberrypi-userland/buildlink3.mk"
 .endif

Index: pkgsrc/devel/SDL2/patches/patch-src_audio_netbsd_SDL__netbsdaudio.c
diff -u pkgsrc/devel/SDL2/patches/patch-src_audio_netbsd_SDL__netbsdaudio.c:1.1 pkgsrc/devel/SDL2/patches/patch-src_audio_netbsd_SDL__netbsdaudio.c:1.2
--- pkgsrc/devel/SDL2/patches/patch-src_audio_netbsd_SDL__netbsdaudio.c:1.1     Tue Sep 26 13:10:56 2017
+++ pkgsrc/devel/SDL2/patches/patch-src_audio_netbsd_SDL__netbsdaudio.c Fri May 24 18:13:36 2019
@@ -1,15 +1,28 @@
-$NetBSD: patch-src_audio_netbsd_SDL__netbsdaudio.c,v 1.1 2017/09/26 13:10:56 adam Exp $
+$NetBSD: patch-src_audio_netbsd_SDL__netbsdaudio.c,v 1.2 2019/05/24 18:13:36 nia Exp $
 
-Remove delay as there is already an inherent delay in writing audio.
+Remove delays and use blocking i/o
 https://bugzilla.libsdl.org/show_bug.cgi?id=3177
 
 audio_prinfo needs 'struct' on NetBSD.
-Use correct prinfo.
-Inform upper layer of blocksize
+Use correct prinfo type (play/record)
+Rework initialization
 
---- src/audio/netbsd/SDL_netbsdaudio.c.orig    2017-09-26 12:34:35.000000000 +0000
+--- src/audio/netbsd/SDL_netbsdaudio.c.orig    2018-10-31 15:07:22.000000000 +0000
 +++ src/audio/netbsd/SDL_netbsdaudio.c
-@@ -63,14 +63,14 @@ NETBSDAUDIO_Status(_THIS)
+@@ -43,12 +43,7 @@
+ #include "../SDL_audiodev_c.h"
+ #include "SDL_netbsdaudio.h"
+ 
+-/* Use timer for synchronization */
+-/* #define USE_TIMER_SYNC */
+-
+ /* #define DEBUG_AUDIO */
+-/* #define DEBUG_AUDIO_STREAM */
+-
+ 
+ static void
+ NETBSDAUDIO_DetectDevices(void)
+@@ -63,14 +58,14 @@ NETBSDAUDIO_Status(_THIS)
  #ifdef DEBUG_AUDIO
      /* *INDENT-OFF* */
      audio_info_t info;
@@ -26,19 +39,159 @@ Inform upper layer of blocksize
  
      fprintf(stderr, "\n"
              "[%s info]\n"
-@@ -184,10 +184,6 @@ NETBSDAUDIO_PlayDevice(_THIS)
-         fprintf(stderr, "Wrote %d bytes of audio data\n", written);
- #endif
+@@ -115,90 +110,37 @@ NETBSDAUDIO_Status(_THIS)
+             (info.mode == AUMODE_PLAY) ? "PLAY"
+             : (info.mode = AUMODE_RECORD) ? "RECORD"
+             : (info.mode == AUMODE_PLAY_ALL ? "PLAY_ALL" : "?"));
++
++    fprintf(stderr, "\n"
++            "[audio spec]\n"
++            "format           :   0x%x\n"
++            "size             :   %u\n"
++            "",
++            this->spec.format,
++            this->spec.size);
+     /* *INDENT-ON* */
+ #endif /* DEBUG_AUDIO */
+ }
+ 
  
+-/* This function waits until it is possible to write a full sound buffer */
+-static void
+-NETBSDAUDIO_WaitDevice(_THIS)
+-{
+-#ifndef USE_BLOCKING_WRITES     /* Not necessary when using blocking writes */
+-    /* See if we need to use timed audio synchronization */
+-    if (this->hidden->frame_ticks) {
+-        /* Use timer for general audio synchronization */
+-        Sint32 ticks;
+-
+-        ticks = ((Sint32) (this->hidden->next_frame - SDL_GetTicks())) - FUDGE_TICKS;
+-        if (ticks > 0) {
+-            SDL_Delay(ticks);
+-        }
+-    } else {
+-        /* Use SDL_IOReady() for audio synchronization */
+-#ifdef DEBUG_AUDIO
+-        fprintf(stderr, "Waiting for audio to get ready\n");
+-#endif
+-        if (SDL_IOReady(this->hidden->audio_fd, SDL_TRUE, 10 * 1000)
+-            <= 0) {
+-            const char *message =
+-                "Audio timeout - buggy audio driver? (disabled)";
+-            /* In general we should never print to the screen,
+-               but in this case we have no other way of letting
+-               the user know what happened.
+-             */
+-            fprintf(stderr, "SDL: %s\n", message);
+-            SDL_OpenedAudioDeviceDisconnected(this);
+-            /* Don't try to close - may hang */
+-            this->hidden->audio_fd = -1;
+-#ifdef DEBUG_AUDIO
+-            fprintf(stderr, "Done disabling audio\n");
+-#endif
+-        }
+-#ifdef DEBUG_AUDIO
+-        fprintf(stderr, "Ready!\n");
+-#endif
+-    }
+-#endif /* !USE_BLOCKING_WRITES */
+-}
+-
+ static void
+ NETBSDAUDIO_PlayDevice(_THIS)
+ {
+-    int written, p = 0;
++    struct SDL_PrivateAudioData *h = this->hidden;
++    int written;
+ 
+-    /* Write the audio data, checking for EAGAIN on broken audio drivers */
+-    do {
+-        written = write(this->hidden->audio_fd,
+-                        &this->hidden->mixbuf[p], this->hidden->mixlen - p);
+-
+-        if (written > 0)
+-            p += written;
+-        if (written == -1 && errno != 0 && errno != EAGAIN && errno != EINTR) {
+-            /* Non recoverable error has occurred. It should be reported!!! */
+-            perror("audio");
+-            break;
+-        }
++    /* Write the audio data */
++    written = write(h->audio_fd, h->mixbuf, h->mixlen);
++    if (written == -1) {
++        /* Non recoverable error has occurred. It should be reported!!! */
++        SDL_OpenedAudioDeviceDisconnected(this);
++        perror("audio");
++        return;
++    }
+ 
+ #ifdef DEBUG_AUDIO
+-        fprintf(stderr, "Wrote %d bytes of audio data\n", written);
++    fprintf(stderr, "Wrote %d bytes of audio data\n", written);
+ #endif
+-
 -        if (p < this->hidden->mixlen
 -            || ((written < 0) && ((errno == 0) || (errno == EAGAIN)))) {
 -            SDL_Delay(1);       /* Let a little CPU time go by */
 -        }
-     } while (p < this->hidden->mixlen);
+-    } while (p < this->hidden->mixlen);
+-
+-    /* If timer synchronization is enabled, set the next write frame */
+-    if (this->hidden->frame_ticks) {
+-        this->hidden->next_frame += this->hidden->frame_ticks;
+-    }
+-
+-    /* If we couldn't write, assume fatal error for now */
+-    if (written < 0) {
+-        SDL_OpenedAudioDeviceDisconnected(this);
+-    }
+ }
+ 
+ static Uint8 *
+@@ -212,28 +154,19 @@ static int
+ NETBSDAUDIO_CaptureFromDevice(_THIS, void *_buffer, int buflen)
+ {
+     Uint8 *buffer = (Uint8 *) _buffer;
+-    int br, p = 0;
++    int br;
  
-     /* If timer synchronization is enabled, set the next write frame */
-@@ -274,7 +270,7 @@ NETBSDAUDIO_OpenDevice(_THIS, void *hand
-     const int flags = iscapture ? OPEN_FLAGS_INPUT : OPEN_FLAGS_OUTPUT;
+-    /* Capture the audio data, checking for EAGAIN on broken audio drivers */
+-    do {
+-        br = read(this->hidden->audio_fd, buffer + p, buflen - p);
+-        if (br > 0)
+-            p += br;
+-        if (br == -1 && errno != 0 && errno != EAGAIN && errno != EINTR) {
+-            /* Non recoverable error has occurred. It should be reported!!! */
+-            perror("audio");
+-            return p ? p : -1;
+-        }
++    br = read(this->hidden->audio_fd, buffer, buflen);
++    if (br == -1) {
++        /* Non recoverable error has occurred. It should be reported!!! */
++        perror("audio");
++        return -1;
++    }
+ 
+ #ifdef DEBUG_AUDIO
+-        fprintf(stderr, "Captured %d bytes of audio data\n", br);
++    fprintf(stderr, "Captured %d bytes of audio data\n", br);
+ #endif
+-
+-        if (p < buflen
+-            || ((br < 0) && ((errno == 0) || (errno == EAGAIN)))) {
+-            SDL_Delay(1);       /* Let a little CPU time go by */
+-        }
+-    } while (p < buflen);
++    return 0;
+ }
+ 
+ static void
+@@ -271,10 +204,9 @@ NETBSDAUDIO_CloseDevice(_THIS)
+ static int
+ NETBSDAUDIO_OpenDevice(_THIS, void *handle, const char *devname, int iscapture)
+ {
+-    const int flags = iscapture ? OPEN_FLAGS_INPUT : OPEN_FLAGS_OUTPUT;
      SDL_AudioFormat format = 0;
      audio_info_t info;
 -    audio_prinfo *prinfo = iscapture ? &info.play : &info.record;
@@ -46,11 +199,86 @@ Inform upper layer of blocksize
  
      /* We don't care what the devname is...we'll try to open anything. */
      /*  ...but default to first name in the list... */
-@@ -366,6 +362,7 @@ NETBSDAUDIO_OpenDevice(_THIS, void *hand
+@@ -294,25 +226,16 @@ NETBSDAUDIO_OpenDevice(_THIS, void *hand
+     SDL_zerop(this->hidden);
+ 
+     /* Open the audio device */
+-    this->hidden->audio_fd = open(devname, flags, 0);
++    this->hidden->audio_fd = open(devname, iscapture ? O_RDONLY : O_WRONLY);
+     if (this->hidden->audio_fd < 0) {
+         return SDL_SetError("Couldn't open %s: %s", devname, strerror(errno));
+     }
+ 
+     AUDIO_INITINFO(&info);
+ 
+-    /* Calculate the final parameters for this audio specification */
+-    SDL_CalculateAudioSpec(&this->spec);
+-
+-    /* Set to play mode */
+-    info.mode = iscapture ? AUMODE_RECORD : AUMODE_PLAY;
+-    if (ioctl(this->hidden->audio_fd, AUDIO_SETINFO, &info) < 0) {
+-        return SDL_SetError("Couldn't put device into play mode");
+-    }
++    prinfo->encoding = AUDIO_ENCODING_NONE;
+ 
+-    AUDIO_INITINFO(&info);
+-    for (format = SDL_FirstAudioFormat(this->spec.format);
+-         format; format = SDL_NextAudioFormat()) {
++    for (format = SDL_FirstAudioFormat(this->spec.format); format;) {
+         switch (format) {
+         case AUDIO_U8:
+             prinfo->encoding = AUDIO_ENCODING_ULINEAR;
+@@ -338,34 +261,33 @@ NETBSDAUDIO_OpenDevice(_THIS, void *hand
+             prinfo->encoding = AUDIO_ENCODING_ULINEAR_BE;
+             prinfo->precision = 16;
+             break;
+-        default:
+-            continue;
+         }
+-
+-        if (ioctl(this->hidden->audio_fd, AUDIO_SETINFO, &info) == 0) {
++        if (prinfo->encoding != AUDIO_ENCODING_NONE) {
+             break;
+         }
++        format = SDL_NextAudioFormat();
+     }
+ 
+-    if (!format) {
++    if (prinfo->encoding == AUDIO_ENCODING_NONE) {
+         return SDL_SetError("No supported encoding for 0x%x", this->spec.format);
+     }
+ 
+     this->spec.format = format;
+ 
+-    AUDIO_INITINFO(&info);
+-    prinfo->channels = this->spec.channels;
+-    if (ioctl(this->hidden->audio_fd, AUDIO_SETINFO, &info) == -1) {
+-        this->spec.channels = 1;
+-    }
+-    AUDIO_INITINFO(&info);
+-    prinfo->sample_rate = this->spec.freq;
++    /* Calculate spec parameters based on our chosen format */
++    SDL_CalculateAudioSpec(&this->spec);
++
++    info.mode = iscapture ? AUMODE_RECORD : AUMODE_PLAY;
+     info.blocksize = this->spec.size;
+     info.hiwat = 5;
+     info.lowat = 3;
++    prinfo->sample_rate = this->spec.freq;
++    prinfo->channels = this->spec.channels;
      (void) ioctl(this->hidden->audio_fd, AUDIO_SETINFO, &info);
++
      (void) ioctl(this->hidden->audio_fd, AUDIO_GETINFO, &info);
      this->spec.freq = prinfo->sample_rate;
-+    this->spec.size = info.blocksize;
++    this->spec.channels = prinfo->channels;
  
      if (!iscapture) {
          /* Allocate mixing buffer */
+@@ -390,7 +312,6 @@ NETBSDAUDIO_Init(SDL_AudioDriverImpl * i
+     impl->DetectDevices = NETBSDAUDIO_DetectDevices;
+     impl->OpenDevice = NETBSDAUDIO_OpenDevice;
+     impl->PlayDevice = NETBSDAUDIO_PlayDevice;
+-    impl->WaitDevice = NETBSDAUDIO_WaitDevice;
+     impl->GetDeviceBuf = NETBSDAUDIO_GetDeviceBuf;
+     impl->CloseDevice = NETBSDAUDIO_CloseDevice;
+     impl->CaptureFromDevice = NETBSDAUDIO_CaptureFromDevice;



Home | Main Index | Thread Index | Old Index