NetBSD-Users archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: NetBSD alsa and its oss plugin
On Mon, Nov 22, 2021 at 10:00:13PM +0000, nia wrote:
> On Mon, Nov 22, 2021 at 12:02:36PM +0100, Hauke Fath wrote:
> > As a data point, an attempt to record 10 seconds through alsa will hang
> > indefinitely, and leave an empty file stub:
>
> It is repeatedly using SNDCTL_DSP_GETIPTR, which is a wrapper around
> AUDIO_GETIOFFS, which is unimplemented in isaki-audio2, so always
> returns 0 (indicating that no frames are available to read). So
> it assumes that it can't read anything.
>
> https://nxr.netbsd.org/xref/src/sys/dev/audio/audio.c#3031
>
> I'll have to think about this.
I have two patches for you to try. One implements AUDIO_GETIOFFS
in the kernel, the other works around alsa-plugins-oss's abuse
of non-blocking I/O. With both patches, I get crystal clear
recording with arecord.
Index: audio.c
===================================================================
RCS file: /cvsroot/src/sys/dev/audio/audio.c,v
retrieving revision 1.110
diff -u -p -u -r1.110 audio.c
--- audio.c 10 Oct 2021 11:21:05 -0000 1.110
+++ audio.c 23 Nov 2021 00:06:33 -0000
@@ -3029,16 +3029,10 @@ audio_ioctl(dev_t dev, struct audio_soft
break;
case AUDIO_GETIOFFS:
- /* XXX TODO */
- ao = (struct audio_offset *)addr;
- ao->samples = 0;
- ao->deltablks = 0;
- ao->offset = 0;
- break;
-
case AUDIO_GETOOFFS:
ao = (struct audio_offset *)addr;
- track = file->ptrack;
+ track = (cmd == AUDIO_GETOOFFS) ?
+ file->ptrack : file->rtrack;
if (track == NULL) {
ao->samples = 0;
ao->deltablks = 0;
@@ -3063,7 +3057,9 @@ audio_ioctl(dev_t dev, struct audio_soft
offs -= track->usrbuf.capacity;
ao->offset = offs;
- TRACET(3, track, "GETOOFFS: samples=%u deltablks=%u offset=%u",
+ TRACET(3, track, "%s: samples=%u deltablks=%u offset=%u",
+ (cmd == AUDIO_GETOOFS) ?
+ "AUDIO_GETOOFFS" : "AUDIO_GETIOFFS",
ao->samples, ao->deltablks, ao->offset);
break;
? alsa-plugins-oss/recording.wav
? alsa-plugins-oss/test.wav
? alsa-plugins-oss/work
Index: alsa-plugins-oss/Makefile
===================================================================
RCS file: /cvsroot/pkgsrc/audio/alsa-plugins-oss/Makefile,v
retrieving revision 1.14
diff -u -p -u -r1.14 Makefile
--- alsa-plugins-oss/Makefile 30 Jun 2021 15:41:54 -0000 1.14
+++ alsa-plugins-oss/Makefile 23 Nov 2021 00:06:16 -0000
@@ -2,6 +2,7 @@
DISTNAME= alsa-plugins-1.2.5
PKGNAME= ${DISTNAME:S/plugins/plugins-oss/}
+PKGREVISION= 1
CATEGORIES= audio
MASTER_SITES= ftp://ftp.alsa-project.org/pub/plugins/
EXTRACT_SUFX= .tar.bz2
Index: alsa-plugins-oss/distinfo
===================================================================
RCS file: /cvsroot/pkgsrc/audio/alsa-plugins-oss/distinfo,v
retrieving revision 1.12
diff -u -p -u -r1.12 distinfo
--- alsa-plugins-oss/distinfo 26 Oct 2021 09:58:46 -0000 1.12
+++ alsa-plugins-oss/distinfo 23 Nov 2021 00:06:16 -0000
@@ -5,5 +5,5 @@ SHA512 (alsa-plugins-1.2.5.tar.bz2) = 32
Size (alsa-plugins-1.2.5.tar.bz2) = 406134 bytes
SHA1 (patch-aa) = ac2169b0a069bcf6ed60ca7ccd199ccd1988357f
SHA1 (patch-ab) = 9cf0bda9f1928f46d0d5eac9464b790710ea2fda
-SHA1 (patch-ac) = 13da103ce3daad29d3c715f8f7d58dcd7bb9a72c
+SHA1 (patch-ac) = e1a66677909e0d9b210aba0de65ae2222728d6f5
SHA1 (patch-oss_Makefile.in) = 9ca6c96d426f7f150c86ad7a3a15fa0999a3cfdd
Index: alsa-plugins-oss/patches/patch-ac
===================================================================
RCS file: /cvsroot/pkgsrc/audio/alsa-plugins-oss/patches/patch-ac,v
retrieving revision 1.1.1.1
diff -u -p -u -r1.1.1.1 patch-ac
--- alsa-plugins-oss/patches/patch-ac 19 Dec 2008 04:03:22 -0000 1.1.1.1
+++ alsa-plugins-oss/patches/patch-ac 23 Nov 2021 00:06:16 -0000
@@ -1,6 +1,6 @@
$NetBSD: patch-ac,v 1.1.1.1 2008/12/19 04:03:22 jmcneill Exp $
---- oss/pcm_oss.c.orig 2008-10-29 08:42:13.000000000 -0400
+--- oss/pcm_oss.c.orig 2021-05-27 17:18:39.000000000 +0000
+++ oss/pcm_oss.c
@@ -22,7 +22,11 @@
#include <sys/ioctl.h>
@@ -14,7 +14,35 @@ $NetBSD: patch-ac,v 1.1.1.1 2008/12/19 0
typedef struct snd_pcm_oss {
snd_pcm_ioplug_t io;
-@@ -116,7 +120,7 @@ static int oss_drain(snd_pcm_ioplug_t *i
+@@ -49,8 +53,11 @@ static snd_pcm_sframes_t oss_write(snd_p
+ buf = (char *)areas->addr + (areas->first + areas->step * offset) / 8;
+ size *= oss->frame_bytes;
+ result = write(oss->fd, buf, size);
+- if (result <= 0)
++ if (result <= 0) {
++ if (errno == EAGAIN || errno == EWOULDBLOCK)
++ return 0;
+ return result;
++ }
+ return result / oss->frame_bytes;
+ }
+
+@@ -66,9 +73,13 @@ static snd_pcm_sframes_t oss_read(snd_pc
+ /* we handle only an interleaved buffer */
+ buf = (char *)areas->addr + (areas->first + areas->step * offset) / 8;
+ size *= oss->frame_bytes;
++ errno = 0;
+ result = read(oss->fd, buf, size);
+- if (result <= 0)
++ if (result <= 0) {
++ if (errno == EAGAIN || errno == EWOULDBLOCK)
++ return 0;
+ return result;
++ }
+ return result / oss->frame_bytes;
+ }
+
+@@ -116,7 +127,7 @@ static int oss_drain(snd_pcm_ioplug_t *i
snd_pcm_oss_t *oss = io->private_data;
if (io->stream == SND_PCM_STREAM_PLAYBACK)
@@ -23,7 +51,7 @@ $NetBSD: patch-ac,v 1.1.1.1 2008/12/19 0
return 0;
}
-@@ -125,7 +129,7 @@ static int oss_prepare(snd_pcm_ioplug_t
+@@ -125,7 +136,7 @@ static int oss_prepare(snd_pcm_ioplug_t
snd_pcm_oss_t *oss = io->private_data;
int tmp;
@@ -32,7 +60,23 @@ $NetBSD: patch-ac,v 1.1.1.1 2008/12/19 0
tmp = io->channels;
if (ioctl(oss->fd, SNDCTL_DSP_CHANNELS, &tmp) < 0) {
-@@ -355,7 +359,7 @@ static snd_pcm_ioplug_callback_t oss_cap
+@@ -210,6 +221,7 @@ static int oss_hw_params(snd_pcm_ioplug_
+ }
+ oss->fragment_set = 1;
+
++#ifndef __NetBSD__
+ if ((flags = fcntl(oss->fd, F_GETFL)) < 0) {
+ err = -errno;
+ perror("F_GETFL");
+@@ -225,6 +237,7 @@ static int oss_hw_params(snd_pcm_ioplug_
+ perror("F_SETFL");
+ }
+ }
++#endif
+
+ return 0;
+ }
+@@ -356,7 +369,7 @@ static const snd_pcm_ioplug_callback_t o
SND_PCM_PLUGIN_DEFINE_FUNC(oss)
{
snd_config_iterator_t i, next;
Home |
Main Index |
Thread Index |
Old Index