[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(¶ms, 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, ¶ms)) < 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