Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 1 Feb 2000 21:25:23 -0600
From:      Dan Nelson <dnelson@emsphone.com>
To:        "Alexey N. Dokuchaev" <danfe@inet.ssc.nsu.ru>
Cc:        FreeBSD-Questions@FreeBSD.ORG
Subject:   Re: How to use pca0 PS-Speaker sound driver in FreeBSD?
Message-ID:  <20000201212523.A87242@dan.emsphone.com>
In-Reply-To: <Pine.LNX.4.10.10002020853450.4699-100000@inet.ssc.nsu.ru>; from "Alexey N. Dokuchaev" on Wed Feb  2 08:56:29 GMT 2000
References:  <20000120002155.D70698@cc942873-a.ewndsr1.nj.home.com> <Pine.LNX.4.10.10002020853450.4699-100000@inet.ssc.nsu.ru>

next in thread | previous in thread | raw e-mail | index | archive | help

--3V7upXqbjpZ4EhLz
Content-Type: text/plain; charset=us-ascii

In the last episode (Feb 02), Alexey N. Dokuchaev said:
> I was undable to set up my sound card (must be very weird), so I
> decided to try that pca driver just for fun.  But, even with snd0
> entries in /dev, I can't hear eanything by cating into /dev/audio or
> /dev/dsp.

The pca device is accessed through /dev/pcaudio; the easiest way to use
it is to cat .au soundfiles into it.  Attached is a little C program
which will let you pipe unsigned 8-bit samples into it as well.  Use it
with sox to play other file formats like this:

sox file.wav -r 8000 -t ub -c 1 - | play -s -r 8000

-- 
	Dan Nelson
	dnelson@emsphone.com

--3V7upXqbjpZ4EhLz
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="play.c"

#include <machine/soundcard.h>
#include <machine/pcaudioio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

main(int argc, char *argv[])
{
	int fd;
	int rate = 8012;
	int bits = 8;
	int speaker = 0;
	int channels = 1;
	int c;
	int len;
	char buf[1024];

	while ((c = getopt(argc, argv, "r:b:c:s")) != EOF)
	{
		switch (c)
		{
			case 's':
			speaker = 1;
			break;
		    case 'r':
			rate = atoi(optarg);
			break;
		    case 'c':
			channels = atoi(optarg);
			break;
		    case 'b':
			bits = atoi(optarg);
			break;
			case '?':
			case 'h':
			printf ("play [-s] [-c channels] [-r rate] [-b bits]\n");
			exit(1);
			break;
		}
	}

	if (speaker)
	{
		audio_info_t ait;
		ait.play.sample_rate = rate;
		ait.play.encoding = AUDIO_ENCODING_RAW;
		ait.play.gain = 150;
		ait.play.pause = -1;
		fd = open("/dev/pcaudio", O_WRONLY);
		ioctl(fd, AUDIO_SETINFO, &ait);	
	} else
	{
		fd = open("/dev/dsp", O_WRONLY);
		ioctl(fd, SNDCTL_DSP_SETFMT, &bits);
		ioctl(fd, SOUND_PCM_WRITE_RATE, &rate);
		ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &channels);
	}

	while ((len = read(fileno(stdin), buf, sizeof(buf))) > 0)
		write(fd, buf, len);
}

--3V7upXqbjpZ4EhLz--


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-questions" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20000201212523.A87242>