[long] mpg123 + ALSA [was Re: Jaký zvuk do Linuxu?]

David Jez dave.jez na seznam.cz
Pátek Červen 1 16:41:50 CEST 2001


> mpg123 imo podporuje jenom starsi verze alsalib. S verzi 0.5.1 jsem to taky
> neprelozil. Sveho casu jsem mpg123 sice kvuli tomu predelaval, ale nedotahl
> jsem to do konce. Koneckoncu pres oss emulaci jede mpg123 v pohode.
  Zdravim,

  pokud bys to chtel dokoncit, posilam svuj patch. Tedka na to stejne nebudu
mit tak nasledujici tyden cas. (preklad v pohode, haze to ale chybu pri pokusu
o nsataveni zvukoveho formatu... asi tam bude nekde chyba v implicitnich
hodnotach, popr. spatne nektere prirazovane hodnoty.
  Patch resi tez problem prekladu 3dnow na gcc-2.95 a pridava linux-3dnow-alsa
a linux-mips

Dave


diff -urN mpg123-0.59r.orig/Makefile mpg123-0.59r/Makefile
--- mpg123-0.59r.orig/Makefile	Tue Jun 15 22:39:06 1999
+++ mpg123-0.59r/Makefile	Thu May 31 17:16:38 2001
@@ -52,24 +52,28 @@
 	@echo ""
 	@echo "There are several Linux flavours. Choose one:"
 	@echo ""
-	@echo "make linux          Linux (i386, Pentium or unlisted platform)"
-	@echo "make linux-i486     Linux (optimized for i486 ONLY)"
-	@echo "make linux-3dnow    Linux, output 3DNow!(TM) optimized code"
-	@echo "                    (ie with 'as' from binutils-2.9.1.0.19a or later)"
-	@echo "make linux-alpha    make with minor changes for ALPHA-Linux"
-	@echo "make linux-ppc      LinuxPPC or MkLinux for the PowerPC"
-	@echo "make linux-m68k     Linux/m68k (Amiga, Atari) using OSS"
-	@echo "make linux-nas      Linux, output to Network Audio System"
-	@echo "make linux-sparc    Linux/Sparc"
-	@echo "make linux-sajber   Linux, build binary for Sajber Jukebox frontend"
-	@echo "make linux-alsa     Linux with ALSA sound driver"
-	@echo "make linux-mips-alsa Linux/MIPS with ALSA sound driver"
-	@echo ""
-	@echo "make linux-esd      Linux, output to EsounD"
-	@echo "make linux-alpha-esd Linux/Alpha, output to EsounD"
-	@echo "make linux-ppc-esd  Linux/PPC, output to EsounD"
-	@echo "    NOTE: esd flavours require libaudiofile, available from: "
-	@echo "          http://www.68k.org/~michael/audiofile/"
+	@echo "make linux            Linux (i386, Pentium or unlisted platform)"
+	@echo "make linux-i486       Linux (optimized for i486 ONLY)"
+	@echo "make linux-3dnow      Linux, output 3DNow!(TM) optimized code"
+	@echo "                      (ie with 'as' from binutils-2.9.1.0.19a or later)"
+	@echo "make linux-alpha      make with minor changes for ALPHA-Linux"
+	@echo "make linux-ppc        LinuxPPC or MkLinux for the PowerPC"
+	@echo "make linux-m68k       Linux/m68k (Amiga, Atari) using OSS"
+	@echo "make linux-nas        Linux, output to Network Audio System"
+	@echo "make linux-sparc      Linux/Sparc"
+	@echo "make linux-sajber     Linux, build binary for Sajber Jukebox frontend"
+	@echo "make linux-alsa       Linux with ALSA sound driver"
+	@echo "make linux-3dnow-alsa Linux with ALSA sound driver, output"
+	@echo "                      3DNow!(TM) optimized code"
+	@echo "                      (ie with 'as' from binutils-2.9.1.0.19a or later)"
+	@echo "make linux-mips       Linux/MIPS with OSS sound driver"
+	@echo "make linux-mips-alsa  Linux/MIPS with ALSA sound driver"
+	@echo ""
+	@echo "make linux-esd        Linux, output to EsounD"
+	@echo "make linux-alpha-esd  Linux/Alpha, output to EsounD"
+	@echo "make linux-ppc-esd    Linux/PPC, output to EsounD"
+	@echo "                      NOTE: esd flavours require libaudiofile, available"
+	@echo "                      from: http://www.68k.org/~michael/audiofile/"
 	@echo ""
 	@echo "Please read the file INSTALL for additional information."
 	@echo ""
@@ -119,9 +123,10 @@
 			decode_3dnow.o audio_oss.o term.o' \
 		CFLAGS='-DI386_ASSEM -DREAL_IS_FLOAT -DPENTIUM_OPT -DLINUX \
 			-DUSE_3DNOW -DREAD_MMAP -DOSS -DTERM_CONTROL\
-			-Wall -O2 -m486 \
+			-Wall -O2 -mpentium \
 			-fomit-frame-pointer -funroll-all-loops \
-			-finline-functions -ffast-math' \
+			-finline-functions -ffast-math \
+			-fexpensive-optimizations' \
 		mpg123-make
 
 linux-i486:
@@ -156,6 +161,29 @@
 		CFLAGS='-DI386_ASSEM -DREAL_IS_FLOAT -DPENTIUM_OPT -DLINUX \
 			-DREAD_MMAP -DALSA -DTERM_CONTROL\
 			-Wall  -O2 -m486 \
+			-fomit-frame-pointer -funroll-all-loops \
+			-finline-functions -ffast-math \
+			$(RPM_OPT_FLAGS)' \
+		mpg123-make
+
+linux-3dnow-alsa:
+	$(MAKE) CC=gcc LDFLAGS= \
+		AUDIO_LIB='-lasound' \
+		OBJECTS='decode_i386.o dct64_3dnow.o \
+			decode_3dnow.o audio_alsa.o term.o' \
+		CFLAGS='-DI386_ASSEM -DREAL_IS_FLOAT -DPENTIUM_OPT -DLINUX \
+			-DUSE_3DNOW -DREAD_MMAP -DALSA -DTERM_CONTROL\
+			-Wall -O2 -mpentium \
+			-fomit-frame-pointer -funroll-all-loops \
+			-finline-functions -ffast-math \
+			-fexpensive-optimizations' \
+		mpg123-make
+
+linux-mips:
+	$(MAKE) CC=gcc LDFLAGS= \
+		OBJECTS='decode.o dct64.o audio_oss.o term.o' \
+		CFLAGS='-DREAL_IS_FLOAT -DLINUX -DREAD_MMAP -DOSS \
+			-DTERM_CONTROL -Wall  -O2 \
 			-fomit-frame-pointer -funroll-all-loops \
 			-finline-functions -ffast-math \
 			$(RPM_OPT_FLAGS)' \
diff -urN mpg123-0.59r.orig/audio.c mpg123-0.59r/audio.c
--- mpg123-0.59r.orig/audio.c	Tue Apr  6 17:53:05 1999
+++ mpg123-0.59r/audio.c	Thu May 31 20:03:15 2001
@@ -17,9 +17,11 @@
   ai->output = -1;
 #ifdef ALSA
   ai->handle = NULL;
+  ai->alsa_format.interleave = 1;
   ai->alsa_format.format = -1;
   ai->alsa_format.rate = -1;
-  ai->alsa_format.channels = -1;
+  ai->alsa_format.voices = 1;
+  ai->alsa_format.special = 1;
 #endif
   ai->device = NULL;
   ai->channels = -1;
diff -urN mpg123-0.59r.orig/audio.h mpg123-0.59r/audio.h
--- mpg123-0.59r.orig/audio.h	Tue Jun 15 22:22:03 1999
+++ mpg123-0.59r/audio.h	Thu May 31 17:20:23 2001
@@ -53,7 +53,7 @@
   long gain;
   int output;
 #ifdef ALSA
-  void *handle;
+  snd_pcm_t *handle;
   snd_pcm_format_t alsa_format;
 #endif
   char *device;
diff -urN mpg123-0.59r.orig/audio_alsa.c mpg123-0.59r/audio_alsa.c
--- mpg123-0.59r.orig/audio_alsa.c	Fri May 28 12:25:50 1999
+++ mpg123-0.59r/audio_alsa.c	Thu May 31 20:07:27 2001
@@ -5,6 +5,8 @@
  *  Cleanups by Jaroslav Kysela <perex na jcu.cz>
  *              Ville Syrjala <syrjala na sci.fi>
  *
+ *  Revision for alsa-lib-0.5x by David Jez <dave.jez na seznam.cz> 2001
+ *
  *  You can use -a <soundcard #>:<device #>...
  *  For example: mpg123 -a 1:0 aaa.mpg
  *               mpg123 -a guspnp:1 aaa.mpg
@@ -75,30 +77,61 @@
 	return 0;
 }
 
-static void audio_set_playback_params(struct audio_info_struct *ai)
+static int audio_set_playback_params(struct audio_info_struct *ai)
 {
-	int err;
-	snd_pcm_playback_info_t pi;
-	snd_pcm_playback_params_t pp;
+	int err,channel;
+	snd_pcm_info_t info;
+	snd_pcm_channel_info_t chninfo;
+	snd_pcm_channel_params_t params;
 
-	if((err=snd_pcm_playback_info(ai->handle, &pi)) < 0 )
+	if((err=snd_pcm_info(ai->handle, &info))<0)
 	{
 		fprintf(stderr, "playback info failed: %s\n", snd_strerror(err));
-		return;	/* not fatal error */
+		return -1;	/* not fatal error */
+	}
+
+	if(info.flags & SND_PCM_INFO_PLAYBACK)
+		channel=SND_PCM_CHANNEL_PLAYBACK;
+	else
+		return -1;
+
+	bzero(&chninfo, sizeof(chninfo));
+	chninfo.channel = channel;
+	if((err=snd_pcm_channel_info(ai->handle, &chninfo))<0)
+	{
+		fprintf(stderr, "channel info error: %s\n", snd_strerror(err));
+		return -1;
 	}
 
-	bzero(&pp, sizeof(pp));
-	pp.fragment_size = pi.buffer_size/4;
-	if (pp.fragment_size > pi.max_fragment_size) pp.fragment_size = pi.max_fragment_size;
-	if (pp.fragment_size < pi.min_fragment_size) pp.fragment_size = pi.min_fragment_size;
-	pp.fragments_max = -1;
-	pp.fragments_room = 1;
+	memset(&params, 0, sizeof(params));
+	params.channel = chninfo.channel;
+	params.mode = chninfo.mode;
+	params.format = ai->alsa_format;
+	params.digital = chninfo.dig_mask;
+	if (channel == SND_PCM_CHANNEL_PLAYBACK) {
+		params.start_mode = SND_PCM_START_FULL;
+	} else {
+		params.start_mode = SND_PCM_START_DATA;
+	}
+	params.stop_mode = SND_PCM_STOP_STOP;
+	params.time = 0;
+	params.ust_time = 0;
+	params.buf.stream.queue_size = 0;
+	params.buf.stream.fill = 0;
+	params.buf.stream.max_fill = 0;
+	params.buf.block.frag_size = chninfo.buffer_size/4;
+	if (params.buf.block.frag_size > chninfo.max_fragment_size) params.buf.block.frag_size = chninfo.max_fragment_size;
+	if (params.buf.block.frag_size < chninfo.min_fragment_size) params.buf.block.frag_size = chninfo.min_fragment_size;
+	params.buf.block.frags_min = chninfo.min_fragment_size;
+	params.buf.block.frags_max = chninfo.max_fragment_size;
+	params.reserved[0] = 0;
 
-	if((err=snd_pcm_playback_params(ai->handle, &pp)) < 0 )
+	if((err=snd_pcm_channel_params(ai->handle, &params)) < 0 )
 	{
 		fprintf(stderr, "playback params failed: %s\n", snd_strerror(err));
-		return; /* not fatal error */
+		return -1;
 	}
+	return 0;
 }
 
 int audio_reset_parameters(struct audio_info_struct *ai)
@@ -124,29 +157,24 @@
 
 	ai->alsa_format.rate=ai->rate;
 
-	if((ret=snd_pcm_playback_format(ai->handle, &ai->alsa_format)) < 0 )
-		return -1;
+	ret = audio_set_playback_params(ai);
 
-	audio_set_playback_params(ai);
+	if (ret<0)
+		fprintf(stderr, "audio_set_rate error\n");
 
-	return 0;
+	return ret;
 }
 
 int audio_set_channels(struct audio_info_struct *ai)
 {
 	int ret;
 
-	if(ai->alsa_format.channels < 0)
-		return 0;
+	ret = audio_set_playback_params(ai);
 
-	ai->alsa_format.channels = ai->channels;
+	if (ret<0)
+		fprintf(stderr, "audio_set_channels error\n");
 
-	if((ret=snd_pcm_playback_format(ai->handle, &ai->alsa_format)) < 0 )
-		return -1;
-
-	audio_set_playback_params(ai);
-
-	return 0;
+	return ret;
 }
 
 int audio_set_format(struct audio_info_struct *ai)
@@ -179,19 +207,20 @@
 			break;
 	}
 
-	if((ret=snd_pcm_playback_format(ai->handle, &ai->alsa_format)) < 0 )
-		return -1;
+	ret = audio_set_playback_params(ai);
 
-	audio_set_playback_params(ai);
+	if (ret<0)
+		fprintf(stderr, "audio_set_format error\n");
 
-	return 0;
+	return ret;
 }
 
 int audio_get_formats(struct audio_info_struct *ai)
 {
-	int i, err;
+	int i, err,channel;
 	int fmt = -1;
-	snd_pcm_playback_info_t pi;
+	snd_pcm_info_t info;
+	snd_pcm_channel_info_t chninfo;
 
 	static int fmts[] = {
 		AUDIO_FORMAT_SIGNED_16, AUDIO_FORMAT_UNSIGNED_16,
@@ -204,14 +233,27 @@
 		SND_PCM_FMT_MU_LAW, SND_PCM_FMT_A_LAW
 	};
 
-	if((err=snd_pcm_playback_info(ai->handle, &pi)) < 0 )
+	if((err=snd_pcm_info(ai->handle, &info))<0)
 	{
 		fprintf(stderr, "playback info failed: %s\n", snd_strerror(err));
+		return -1;	/* not fatal error */
+	}
+
+	if(info.flags & SND_PCM_INFO_PLAYBACK)
+		channel=SND_PCM_CHANNEL_PLAYBACK;
+	else
+		return -1;
+
+	bzero(&chninfo, sizeof(chninfo));
+	chninfo.channel = channel;
+	if((err=snd_pcm_channel_info(ai->handle, &chninfo))<0)
+	{
+		fprintf(stderr, "channel info error: %s\n", snd_strerror(err));
 		return -1;
 	}
 
 	for (i = 0; i < 6; i++) {
-		if (pi.formats & afmts[i]) {
+		if (chninfo.formats & afmts[i]) {
 			if (fmt == -1)
 				fmt = 0;
 			fmt |= fmts[i];
diff -urN mpg123-0.59r.orig/dct64_3dnow.s mpg123-0.59r/dct64_3dnow.s
--- mpg123-0.59r.orig/dct64_3dnow.s	Mon Feb 15 14:33:45 1999
+++ mpg123-0.59r/dct64_3dnow.s	Thu May 31 17:16:38 2001
@@ -16,7 +16,7 @@
 dct64:
 	pushl %ebp
 	movl %esp,%ebp
-	subl $256,%esp 	/ tmp-buff
+	subl $256,%esp
 	pushl %ebx
 	pushl %edi
 	movl 16(%ebp),%eax
@@ -150,7 +150,6 @@
         movq  56(%ebx),%mm6
         movd %mm0,72(%edx)
 
-        / 8
 
         pfmul     %mm6,%mm4
 	movl $2,%eax
@@ -159,11 +158,9 @@
 	movl pnts+4,%ebx
         movd %mm4,64(%edx)
 
-/ end part 1
 
 
 part2:
-        / 1
         movd  60(%edx),%mm1
         movd  56(%edx),%mm2
         movq    (%edx),%mm0
@@ -241,7 +238,6 @@
         movl $2,%eax
         movl pnts+8,%ebx
 part3:
-        / 1
         movd  28(%ecx),%mm1
         movd  24(%ecx),%mm2
         movq    (%ecx),%mm0
@@ -259,7 +255,6 @@
         psrlq $32,%mm0
         movd %mm0,24(%edx)
 
-        / 1 + 32
         movd  60(%ecx),%mm1
         movd  56(%ecx),%mm2
         movq    32(%ecx),%mm0
@@ -277,7 +272,6 @@
         psrlq $32,%mm0
         movd %mm0,56(%edx)
 
-        / 2
         movd  20(%ecx),%mm1
         movd  16(%ecx),%mm2
         movq   8(%ecx),%mm0
@@ -295,7 +289,6 @@
         psrlq $32,%mm0
         movd %mm0,16(%edx)
 
-        / 2 + 32
         movd  52(%ecx),%mm1
         movd  48(%ecx),%mm2
         movq   40(%ecx),%mm0
@@ -326,7 +319,6 @@
 	movq (%ebx),%mm4
 
 part4:
-        / 1
         movd  12(%edx),%mm1
         movd  8(%edx),%mm2
         movq    (%edx),%mm0
@@ -356,7 +348,6 @@
         addl $-128,%ecx
         addl $-128,%edx
 
-/ part 5
 
         movl $4,%eax
 
@@ -391,27 +382,27 @@
 
         movq %mm2,%mm6
         movd 16(%ecx),%mm0
-        pfadd %mm3,%mm6   / 6
+        pfadd %mm3,%mm6
         movd 20(%ecx),%mm1
         pfsub %mm2,%mm3
         movq %mm0,%mm7
 
         pfmul %mm4,%mm3
         pfadd %mm1,%mm7
-        movd %mm3,28(%edx) / 7
+        movd %mm3,28(%edx)
 
-        pfsub %mm1,%mm0   / 5 = 4 - 5
-        pfadd %mm3,%mm6   / 6 += 7
+        pfsub %mm1,%mm0
+        pfadd %mm3,%mm6
 
         pfmul %mm4,%mm0   
-	pfadd %mm6,%mm7   / 4 += 6
+	pfadd %mm6,%mm7
         movd %mm7,16(%edx) 
 
-	pfadd %mm0,%mm6   / 6 += 5
+	pfadd %mm0,%mm6
         addl $32,%ecx
         movd %mm6,24(%edx)
 	
-	pfadd %mm3,%mm0   / 5 += 7
+	pfadd %mm3,%mm0
         movd %mm0,20(%edx)
 
         addl $32,%edx
@@ -420,11 +411,10 @@
 
 	addl $-128,%edx
 
-        movl 8(%ebp),%ebx / out0
-        movl 12(%ebp),%edi / out1
+        movl 8(%ebp),%ebx
+        movl 12(%ebp),%edi
 
-	subl %ebx,%edi	/ allows ebx 16 bit relative addressing 
-			/ maybe only ´as´ need this
+	subl %ebx,%edi
 
 	movl (%edx),%eax
 	movl %eax,0x40*16(%ebx)
@@ -444,8 +434,8 @@
         movl 4*7(%edx),%eax
         movl %eax,0x40*12(%ebx,%edi)
 
-	movd 32(%edx),%mm0 / 8
-	movd 48(%edx),%mm1 / C
+	movd 32(%edx),%mm0
+	movd 48(%edx),%mm1
 	pfadd %mm1,%mm0
 	movd %mm0,4*0xe0(%ebx)	
 	movd 40(%edx),%mm0
@@ -470,7 +460,6 @@
         movd %mm0,4*0xa0(%ebx,%edi)
         movd %mm1,4*0xe0(%ebx,%edi)
 
-	////
 
 	movq 4*0x10(%edx),%mm2
 	movq 4*0x18(%edx),%mm0
diff -urN mpg123-0.59r.orig/decode_3dnow.s mpg123-0.59r/decode_3dnow.s
--- mpg123-0.59r.orig/decode_3dnow.s	Mon Feb 15 12:36:46 1999
+++ mpg123-0.59r/decode_3dnow.s	Thu May 31 17:16:38 2001
@@ -132,7 +132,7 @@
 	pf2id %mm4,%mm4
 	movd %mm4,%eax
 
-	sar	$16,%eax	/ new clip
+	sar	$16,%eax
 	movw %ax,(%esi)
 
 	addl $64,%ebx
@@ -141,7 +141,6 @@
 	decl %ebp
 	jnz .L55
 
-/ --- end of loop 1 ---
 
 	movd (%ecx),%mm2
 	movd (%ebx),%mm1
@@ -185,7 +184,7 @@
 	pf2id %mm2,%mm2
 	movd %mm2,%eax
 
-	sar $16,%eax	/ new clip
+	sar $16,%eax
 
 	movw %ax,(%esi)
 
@@ -242,7 +241,7 @@
 	pf2id %mm0,%mm0
 	movd %mm0,%eax
 
-	sar $16,%eax	/ new clip
+	sar $16,%eax
 
 	movw %ax,(%esi)
 
@@ -252,7 +251,6 @@
 	decl %ebp
 	jnz .L68
 
-/ --- end of loop 2
 
 	femms
 
-- 
-------------------------------------------------------
  David "Dave" Jez                Brno, CZ, Europe
 E-mail: dave.jez na seznam.cz
PGP key: finger xjezda00 na fest.stud.fee.vutbr.cz

  SPSE Brno, Kounicova 16	  D4/S4P 1997 - 2001
motto: ,,Uceni jeste nikoho nezabilo, proc vsak zbytecne
         riskovat?''
---------=[ ~EOF ]=------------------------------------


Další informace o konferenci Linux