summaryrefslogtreecommitdiff
path: root/devel/SDL2
diff options
context:
space:
mode:
authornia <nia@pkgsrc.org>2019-05-24 18:13:36 +0000
committernia <nia@pkgsrc.org>2019-05-24 18:13:36 +0000
commitc64c9dfc09dc17671e13e5507c4ab471885f7b8f (patch)
tree5fc94ea4c31237a4c3bc1d7a3dc398b7e00c2898 /devel/SDL2
parent2ba29340265ddb40103a8051586c30860e358be9 (diff)
downloadpkgsrc-c64c9dfc09dc17671e13e5507c4ab471885f7b8f.tar.gz
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.
Diffstat (limited to 'devel/SDL2')
-rw-r--r--devel/SDL2/Makefile4
-rw-r--r--devel/SDL2/distinfo4
-rw-r--r--devel/SDL2/options.mk27
-rw-r--r--devel/SDL2/patches/patch-src_audio_netbsd_SDL__netbsdaudio.c258
4 files changed, 264 insertions, 29 deletions
diff --git a/devel/SDL2/Makefile b/devel/SDL2/Makefile
index 2ae62a180b2..a47381bc16f 100644
--- a/devel/SDL2/Makefile
+++ b/devel/SDL2/Makefile
@@ -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/
diff --git a/devel/SDL2/distinfo b/devel/SDL2/distinfo
index d0a94b9eafc..c00ef614169 100644
--- a/devel/SDL2/distinfo
+++ b/devel/SDL2/distinfo
@@ -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
diff --git a/devel/SDL2/options.mk b/devel/SDL2/options.mk
index ba3cd089ab0..dba7a1c033b 100644
--- a/devel/SDL2/options.mk
+++ b/devel/SDL2/options.mk
@@ -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
diff --git a/devel/SDL2/patches/patch-src_audio_netbsd_SDL__netbsdaudio.c b/devel/SDL2/patches/patch-src_audio_netbsd_SDL__netbsdaudio.c
index 1481765478f..65cedc4e225 100644
--- a/devel/SDL2/patches/patch-src_audio_netbsd_SDL__netbsdaudio.c
+++ b/devel/SDL2/patches/patch-src_audio_netbsd_SDL__netbsdaudio.c
@@ -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;