diff options
author | John Marino <marino@FreeBSD.org> | 2014-05-10 23:40:37 +0000 |
---|---|---|
committer | John Marino <marino@FreeBSD.org> | 2014-05-10 23:40:37 +0000 |
commit | 0f24bf17a53e2968f05411e20941526d374761fd (patch) | |
tree | 9718026000795ce87e17ca3ace6cc6c449b27c7f /audio/timidity/files/patch-linux_a.c | |
parent | Update to new upstream release 2.3.4. (diff) |
audio/timidity & guspat: Add guspat as alternative for goemon
Neither port is currently maintained
PR: ports/177074
Submitted by: Green Dog
Approved by: timidity maintainer (Kevin Zheng) before he dropped it
Notes
Notes:
svn path=/head/; revision=353632
Diffstat (limited to 'audio/timidity/files/patch-linux_a.c')
-rw-r--r-- | audio/timidity/files/patch-linux_a.c | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/audio/timidity/files/patch-linux_a.c b/audio/timidity/files/patch-linux_a.c new file mode 100644 index 000000000000..0d383938cdc0 --- /dev/null +++ b/audio/timidity/files/patch-linux_a.c @@ -0,0 +1,139 @@ +--- ./linux_a.c.orig 1996-05-20 08:09:46.000000000 -0500 ++++ ./linux_a.c 2013-04-21 10:18:23.000000000 -0500 +@@ -71,12 +71,15 @@ + then 8-bit unsigned if it fails. If you have a sound device that + can't handle either, let me know. */ + ++/* Flag for Luigi Rizzo new sound driver (as opposed to VoxWare) */ ++static int luigi_driver = 0; ++ + static int open_output(void) + { + int fd, tmp, i, warnings=0; + + /* Open the audio device */ +- fd=open(dpm.name, O_RDWR | O_NDELAY); ++ fd=open(dpm.name, O_RDWR); + if (fd<0) + { + ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "%s: %s", +@@ -84,6 +87,23 @@ + return -1; + } + ++ /* Figure out if we're running with the Luigi driver or ++ the original VoxWare driver, with code based on dburr/luigi ++ in ports/5607. It'd be great if we could do this before ++ opening the audio device, but oh well... */ ++#if defined(AIOGFMT) /* only defined in Luigi driver */ ++ { ++ snd_chan_param s; ++ int i; ++ i = ioctl(fd, AIOGFMT, &s); ++ if (i != -1) ++ luigi_driver = 1; ++ } ++#endif ++ ++ ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "Using %s sound driver", ++ luigi_driver ? "luigi" : "VoxWare"); ++ + /* They can't mean these */ + dpm.encoding &= ~(PE_ULAW|PE_BYTESWAP); + +@@ -92,6 +112,29 @@ + the other one. */ + + i=tmp=(dpm.encoding & PE_16BIT) ? 16 : 8; ++ if (luigi_driver) ++ { ++ if (dpm.encoding & PE_16BIT) { ++ int fmt = AFMT_S16_LE ; ++ ++ if (ioctl(fd, SNDCTL_DSP_SETFMT, &fmt) < 0 || fmt != AFMT_S16_LE) { ++ fmt = AFMT_U8 ; ++ if (ioctl(fd, SNDCTL_DSP_SETFMT, &fmt) < 0 || fmt != AFMT_U8) { ++ ctl->cmsg(CMSG_ERROR, VERB_NORMAL, ++ "%s doesn't support 16- or 8-bit sample width", ++ dpm.name); ++ close(fd); ++ return -1; ++ } ++ ctl->cmsg(CMSG_WARNING, VERB_VERBOSE, ++ "Sample width adjusted to %d bits", tmp); ++ dpm.encoding ^= PE_16BIT; ++ warnings = 1; ++ } ++ } ++ } ++ else ++ { + if (ioctl(fd, SNDCTL_DSP_SAMPLESIZE, &tmp)<0 || tmp!=i) + { + /* Try the other one */ +@@ -109,6 +152,7 @@ + dpm.encoding ^= PE_16BIT; + warnings=1; + } ++ } + if (dpm.encoding & PE_16BIT) + dpm.encoding |= PE_SIGNED; + else +@@ -163,6 +207,8 @@ + /* Set buffer fragments (in extra_param[0]) */ + + tmp=AUDIO_BUFFER_BITS; ++ if (luigi_driver) ++ tmp += 2; + if (!(dpm.encoding & PE_MONO)) tmp++; + if (dpm.encoding & PE_16BIT) tmp++; + tmp |= (dpm.extra_param[0]<<16); +@@ -189,28 +235,35 @@ + return warnings; + } + ++/* output_data comes from Luigi's linux_a.c. This version seems to allow ++ for partial writes to the sound device, where as the original version ++ doesn't. */ + static void output_data(int32 *buf, int32 count) + { ++ char *p; ++ int res, l; ++ + if (!(dpm.encoding & PE_MONO)) count*=2; /* Stereo samples */ + +- if (dpm.encoding & PE_16BIT) +- { ++ if (dpm.encoding & PE_16BIT) { + /* Convert data to signed 16-bit PCM */ + s32tos16(buf, count); +- +- /* Write the data out. Linux likes to give an EINTR if you suspend +- a program while waiting on a write, so we may need to retry. */ +- while ((-1==write(dpm.fd, buf, count * 2)) && errno==EINTR) +- ; +- } +- else +- { ++ res = count*2; ++ } else { + /* Convert to 8-bit unsigned and write out. */ + s32tou8(buf, count); +- +- while ((-1==write(dpm.fd, buf, count)) && errno==EINTR) +- ; ++ res = count; ++ } ++ for (p = (char *) buf; res > 0; res -= l) { ++again: ++ l = write(dpm.fd, p, res); ++ if (l < 0) { ++ if (errno == EINTR) ++ goto again; ++ return; + } ++ p += l; ++ } + } + + static void close_output(void) |