[MPlayer-users] audio output is broken on powerpc
daniel carter
hedonist at win.co.nz
Tue Feb 12 06:39:01 CET 2002
Is this patch the fix or just the change to make it write to /var/log/sound?
I've got a friend who has to use xine because of this problem on their
powerpc
past-in at stud.tu-ilmenau.de wrote:
>[Automatic answer: RTFM (read DOCS, FAQ), also read DOCS/bugreports.html]
>Hello.
>
>My powerpc system:
>Linux manelan061.rz.tu-ilmenau.de 2.4.18-pre9 #1 Sun Feb 10 03:58:18 UTC 2002 ppc unknown
>
>My test stream (5mb prefix of movie):
>http://www.tu-ilmenau.de/~past-in/movie.avi
>
>I've modified libao2/ao_oss.c so that it doesn't touch /dev/dsp,
>but instead it writes to /usr/log/sound what it would otherwise write
>to /dev/dsp. (Patch included below for completeness.)
>
>On an i386 box, this gives me correct pcm data that I can listen to thus:
> $ sox -t raw -r 44100 -c 2 -w -s /usr/log/sound -t ossdsp /dev/dsp
>(And because the patch makes `-ao oss' behave essentially like `-ao pcm'
>(only very much faster (on my powerpc at least (bug in `-ao pcm'?))),
>it should give correct pcm on any machine.)
>
>But on my powerpc, this produces
>http://www.tu-ilmenau.de/~past-in/sound.bz2
>which i've listened to as
> 16-bit little-endian signed
>and 16-bit big-endian signed
>and 16-bit little-endian unsigned
>and 16-bit big-endian unsigned,
>but it never sounds right.
>
>Hope this helps. Keep up the good work.
>
>-paul
>
>
>
>
>
>-------------------------------------------------------------------------------
> fake-dsp-patch against current CVS tree:
>-------------------------------------------------------------------------------
>--- ../mplayer-cvs-download/main/libao2/ao_oss.c Tue Jan 15 22:55:28 2002
>+++ libao2/ao_oss.c Tue Feb 12 03:09:18 2002
>@@ -16,6 +16,18 @@
> #include "audio_out.h"
> #include "audio_out_internal.h"
>
>+#undef HAVE_AUDIO_SELECT
>+static void fill_zz(audio_buf_info *zz)
>+{
>+ static int once=1;
>+ zz->fragments=once?2:1;
>+ zz->fragstotal=2;
>+ zz->fragsize=32768;
>+ zz->bytes=once?65536:32768;
>+ if (once)
>+ once=0;
>+}
>+
> extern int verbose;
>
> static ao_info_t info =
>@@ -106,11 +118,13 @@
> if (verbose)
> printf("audio_setup: using '%s' dsp device\n", dsp);
>
>+#if 0 //@@@
> audio_fd=open(dsp, O_WRONLY);
> if(audio_fd<0){
> printf("Can't open audio device %s -> nosound\n",dsp);
> return 0;
> }
>+#endif
>
> ao_data.bps=channels*rate;
> if(format != AFMT_U8 && format != AFMT_S8)
>@@ -120,9 +134,9 @@
> ao_data.samplerate=rate;
> ioctl (audio_fd, SNDCTL_DSP_SPEED, &ao_data.samplerate);
> }
>-
>+
> ao_data.format=format;
>- ioctl (audio_fd, SNDCTL_DSP_SETFMT, &ao_data.format);
>+// ioctl (audio_fd, SNDCTL_DSP_SETFMT, &ao_data.format);//@@@
> if(format == AFMT_AC3 && ao_data.format != AFMT_AC3) {
> printf("Can't set audio device %s to AC3 output\n", dsp);
> return 0;
>@@ -134,27 +148,34 @@
> // We only use SNDCTL_DSP_CHANNELS for >2 channels, in case some drivers don't have it
> ao_data.channels = channels;
> if (ao_data.channels > 2) {
>+exit(23);
>+//freebsd 4.0 doesn't know SNDCTL_DSP_CHANNELS
>+#if 0
> if ( ioctl(audio_fd, SNDCTL_DSP_CHANNELS, &ao_data.channels) == -1 ||
> ao_data.channels != channels ) {
> printf("audio_setup: Failed to set audio device to %d channels\n", channels);
> return 0;
> }
>+#endif
> }
>- else {
>+ else { //@@@
>+#if 0
> int c = ao_data.channels-1;
> if (ioctl (audio_fd, SNDCTL_DSP_STEREO, &c) == -1) {
> printf("audio_setup: Failed to set audio device to %d channels\n", ao_data.channels);
> return 0;
> }
>+#endif
> }
> printf("audio_setup: using %d channels (requested: %d)\n", ao_data.channels, channels);
> // set rate
> ao_data.samplerate=rate;
>- ioctl (audio_fd, SNDCTL_DSP_SPEED, &ao_data.samplerate);
>+// ioctl (audio_fd, SNDCTL_DSP_SPEED, &ao_data.samplerate); //@@@
>+ao_data.samplerate=44100; //@@@ SAMPLERATE
> printf("audio_setup: using %d Hz samplerate (requested: %d)\n",ao_data.samplerate,rate);
> }
>
>- if(ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &zz)==-1){
>+ if(0&&ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &zz)==-1){
> int r=0;
> printf("audio_setup: driver doesn't support SNDCTL_DSP_GETOSPACE :-(\n");
> if(ioctl(audio_fd, SNDCTL_DSP_GETBLKSIZE, &r)==-1){
>@@ -164,6 +185,9 @@
> printf("audio_setup: %d bytes/frag (GETBLKSIZE)\n",ao_data.outburst);
> }
> } else {
>+//@@@
>+//fprintf(stderr, "init(): fragments=%d fragstotal=%d fragsize=%d bytes=%d\n", zz.fragments,zz.fragstotal,zz.fragsize,zz.bytes);fflush(stderr);
>+fill_zz(&zz);
> printf("audio_setup: frags: %3d/%d (%d bytes/frag) free: %6d\n",
> zz.fragments, zz.fragstotal, zz.fragsize, zz.bytes);
> if(ao_data.buffersize==-1) ao_data.buffersize=zz.bytes;
>@@ -207,6 +231,7 @@
>
> // stop playing and empty buffers (for seeking/pause)
> static void reset(){
>+exit(23);
> uninit();
> audio_fd=open(dsp, O_WRONLY);
> if(audio_fd<0){
>@@ -217,7 +242,9 @@
> ioctl (audio_fd, SNDCTL_DSP_SETFMT, &ao_data.format);
> if(ao_data.format != AFMT_AC3) {
> if (ao_data.channels > 2)
>- ioctl (audio_fd, SNDCTL_DSP_CHANNELS, &ao_data.channels);
>+//freebsd 4.0 doesn't know SNDCTL_DSP_CHANNELS
>+exit(23);
>+// ioctl (audio_fd, SNDCTL_DSP_CHANNELS, &ao_data.channels);
> else {
> int c = ao_data.channels-1;
> ioctl (audio_fd, SNDCTL_DSP_STEREO, &c);
>@@ -244,7 +271,10 @@
> int playsize=ao_data.outburst;
>
> #ifdef SNDCTL_DSP_GETOSPACE
>- if(ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &zz)!=-1){
>+ if(1||ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &zz)!=-1){
>+//@@@
>+//fprintf(stderr, "get_space(): fragments=%d fragstotal=%d fragsize=%d bytes=%d\n", zz.fragments,zz.fragstotal,zz.fragsize,zz.bytes);fflush(stderr);
>+fill_zz(&zz);
> // calculate exact buffer space:
> playsize = zz.fragments*zz.fragsize;
> if (playsize > MAX_OUTBURST)
>@@ -273,7 +303,20 @@
> // return: number of bytes played
> static int play(void* data,int len,int flags){
> len/=ao_data.outburst;
>- len=write(audio_fd,data,len*ao_data.outburst);
>+// len=write(audio_fd,data,len*ao_data.outburst);
>+len=len*ao_data.outburst;
>+{//@@@ sound logging
>+ static int once = 1;
>+ static fd = -1;
>+ if (once) {
>+ once = 0;
>+ fd = open("/usr/log/sound", O_CREAT|O_TRUNC|O_WRONLY, 0644);
>+ if (fd < 0)
>+ exit(23);
>+ }
>+ if (write(fd, data,len)!=len)
>+ exit(23);
>+}
> return len;
> }
>
>@@ -284,15 +327,23 @@
> /* Calculate how many bytes/second is sent out */
> if(audio_delay_method==2){
> int r=0;
>- if(ioctl(audio_fd, SNDCTL_DSP_GETODELAY, &r)!=-1)
>+ if(ioctl(audio_fd, SNDCTL_DSP_GETODELAY, &r)!=-1) {
>+exit(23);
> return ((float)r)/(float)ao_data.bps;
>+ }
> audio_delay_method=1; // fallback if not supported
> }
> if(audio_delay_method==1){
> // SNDCTL_DSP_GETOSPACE
>- if(ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &zz)!=-1)
>+ if(1||ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &zz)!=-1) {
>+//@@@
>+//fprintf(stderr, "get_delay(): fragments=%d fragstotal=%d fragsize=%d bytes=%d\n", zz.fragments,zz.fragstotal,zz.fragsize,zz.bytes);fflush(stderr);
>+fill_zz(&zz);
> return ((float)(ao_data.buffersize-zz.bytes))/(float)ao_data.bps;
>+ }
>+exit(23);
> audio_delay_method=0; // fallback if not supported
> }
>+exit(23);
> return ((float)ao_data.buffersize)/(float)ao_data.bps;
> }
>
>_______________________________________________
>RTFM!!! http://www.MPlayerHQ.hu/DOCS
>Search: http://www.MPlayerHQ.hu/cgi-bin/htsearch
>http://mplayerhq.hu/mailman/listinfo/mplayer-users
>
More information about the MPlayer-users
mailing list