Module Name:    src
Committed By:   nat
Date:           Wed Dec 28 10:04:53 UTC 2016

Modified Files:
        src/sys/dev/ic: am7930.c

Log Message:
Add slinear encoding.  Tested by flxd@

Addresses PR kern/51703: audio fails to attach if hardware can't do CD
quality.

Autoconfiguration of hw paramaters to be done later.  For now it is
possibile to set 8 bits precision 8000 Hz 1 channel via sysctls.


To generate a diff of this commit:
cvs rdiff -u -r1.52 -r1.53 src/sys/dev/ic/am7930.c

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

Modified files:

Index: src/sys/dev/ic/am7930.c
diff -u src/sys/dev/ic/am7930.c:1.52 src/sys/dev/ic/am7930.c:1.53
--- src/sys/dev/ic/am7930.c:1.52	Sat Dec 20 23:36:21 2014
+++ src/sys/dev/ic/am7930.c	Wed Dec 28 10:04:53 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: am7930.c,v 1.52 2014/12/20 23:36:21 jklos Exp $	*/
+/*	$NetBSD: am7930.c,v 1.53 2016/12/28 10:04:53 nat Exp $	*/
 
 /*
  * Copyright (c) 1995 Rolf Grossmann
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: am7930.c,v 1.52 2014/12/20 23:36:21 jklos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: am7930.c,v 1.53 2016/12/28 10:04:53 nat Exp $");
 
 #include "audio.h"
 #if NAUDIO > 0
@@ -53,6 +53,7 @@ __KERNEL_RCSID(0, "$NetBSD: am7930.c,v 1
 
 #include <sys/audioio.h>
 #include <dev/audio_if.h>
+#include <dev/mulaw.h>
 
 #include <dev/ic/am7930reg.h>
 #include <dev/ic/am7930var.h>
@@ -229,7 +230,8 @@ am7930_set_params(void *addr, int setmod
 	sc = addr;
 	if ((usemode & AUMODE_PLAY) == AUMODE_PLAY) {
 		if (p->sample_rate < 7500 || p->sample_rate > 8500 ||
-			p->encoding != AUDIO_ENCODING_ULAW ||
+			(p->encoding != AUDIO_ENCODING_ULAW &&
+			 p->encoding != AUDIO_ENCODING_SLINEAR) ||
 			p->precision != 8 ||
 			p->channels != 1)
 				return EINVAL;
@@ -243,7 +245,8 @@ am7930_set_params(void *addr, int setmod
 	}
 	if ((usemode & AUMODE_RECORD) == AUMODE_RECORD) {
 		if (r->sample_rate < 7500 || r->sample_rate > 8500 ||
-			r->encoding != AUDIO_ENCODING_ULAW ||
+			(r->encoding != AUDIO_ENCODING_ULAW &&
+			 r->encoding != AUDIO_ENCODING_SLINEAR) ||
 			r->precision != 8 ||
 			r->channels != 1)
 				return EINVAL;
@@ -256,6 +259,14 @@ am7930_set_params(void *addr, int setmod
 		}
 	}
 
+	if (p->encoding == AUDIO_ENCODING_SLINEAR ||
+	    r->encoding == AUDIO_ENCODING_SLINEAR) {
+		hw.encoding = AUDIO_ENCODING_ULAW;
+		pfil->req_size = rfil->req_size = 0;
+		pfil->append(rfil, mulaw_to_linear8, &hw);
+		rfil->append(pfil, linear8_to_mulaw, &hw);
+	}
+
 	return 0;
 }
 
@@ -269,6 +280,12 @@ am7930_query_encoding(void *addr, struct
 		fp->precision = 8;
 		fp->flags = 0;
 		break;
+	case 1:
+		strcpy(fp->name, AudioEslinear);
+		fp->encoding = AUDIO_ENCODING_SLINEAR;
+		fp->precision = 8;
+		fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
+		break;
 	default:
 		return EINVAL;
 		    /*NOTREACHED*/

Reply via email to