pkgsrc-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[pkgsrc/trunk]: pkgsrc/devel/SDL2 SDL2: Audio changes!
details: https://anonhg.NetBSD.org/pkgsrc/rev/cbbfc445b7b6
branches: trunk
changeset: 334348:cbbfc445b7b6
user: nia <nia%pkgsrc.org@localhost>
date: Fri May 24 18:13:36 2019 +0000
description:
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:
devel/SDL2/Makefile | 4 +-
devel/SDL2/distinfo | 4 +-
devel/SDL2/options.mk | 27 +-
devel/SDL2/patches/patch-src_audio_netbsd_SDL__netbsdaudio.c | 258 ++++++++++-
4 files changed, 264 insertions(+), 29 deletions(-)
diffs (truncated from 381 to 300 lines):
diff -r 66bf1bce11bc -r cbbfc445b7b6 devel/SDL2/Makefile
--- a/devel/SDL2/Makefile Fri May 24 16:15:17 2019 +0000
+++ b/devel/SDL2/Makefile Fri May 24 18:13:36 2019 +0000
@@ -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 -r 66bf1bce11bc -r cbbfc445b7b6 devel/SDL2/distinfo
--- a/devel/SDL2/distinfo Fri May 24 16:15:17 2019 +0000
+++ b/devel/SDL2/distinfo Fri May 24 18:13:36 2019 +0000
@@ -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 -r 66bf1bce11bc -r cbbfc445b7b6 devel/SDL2/options.mk
--- a/devel/SDL2/options.mk Fri May 24 16:15:17 2019 +0000
+++ b/devel/SDL2/options.mk Fri May 24 18:13:36 2019 +0000
@@ -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 @@
.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-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 @@
.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 -r 66bf1bce11bc -r cbbfc445b7b6 devel/SDL2/patches/patch-src_audio_netbsd_SDL__netbsdaudio.c
--- a/devel/SDL2/patches/patch-src_audio_netbsd_SDL__netbsdaudio.c Fri May 24 16:15:17 2019 +0000
+++ b/devel/SDL2/patches/patch-src_audio_netbsd_SDL__netbsdaudio.c Fri May 24 18:13:36 2019 +0000
@@ -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 @@
fprintf(stderr, "\n"
"[%s info]\n"
-@@ -184,10 +184,6 @@ NETBSDAUDIO_PlayDevice(_THIS)
- fprintf(stderr, "Wrote %d bytes of audio data\n", written);
+@@ -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 @@
/* 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);
+
Home |
Main Index |
Thread Index |
Old Index