> > Please give more information.  I have a Audiotrak Maya EX7 (USB)
> > (8 channels) and would love to use it as 2 (or 3 or 4) stereo devices.

Clemens, I followed your advice and wrote the following .asoundrc.
The device pcm.main works with aplay, alsaplayer and xmms (without
the mmap option) but it doesn't work with libao2 version 0.8.4-1.1
(Debian). Attempts to send sound to the device just hang (please see
below).

One problem that I have with this setup is that if I connect mplayer
to pcm.main then plug resamples to 44100Hz even if, for example, I am
playing a 32000Hz sample that my hardware can play directly.  This almost
doubles the CPU used by mplayer.  I guess that there is no way around
this (which is why I still have pcm.mplayer). (I chose 44100Hz as the
default because I normally play MP3s.)

        pcm_slave.ex7 {
                pcm "hw:0"
                channels 8
                rate 44100
                buffer_size 4096
                period_size 2048
        }
        pcm.ch12 {
                type dshare
                ipc_key 1234321
                slave ex7
                bindings.0 0
                bindings.1 1
        }
        pcm.ch34 {
                type dshare
                ipc_key 1234321
                slave ex7
                bindings.0 2
                bindings.1 3
        }
        pcm.phones {
                type plug
                slave.pcm ch12
        }
        pcm.main {
                type plug
                slave.pcm ch34
        }
        pcm.!default {
                type plug
                slave.pcm ch34
        }
        pcm.mplayer{
                type plug
                slave {
                        pcm {
                                type hw
                                card 0
                        }
                }
                ttable
                {
                        0 { 2 1 }
                        1 { 3 1 }
                }
        }

Why doesn't libao work with pcm.main or pcm.phones? It works
fine with pcm.mplayer.  Here is my little test program:
        #include <stdio.h>
        #include <ao/ao.h>
        #include <math.h>
        #include <assert.h>

        int main(int argc, char **argv)
        {
                ao_device *device;
                ao_sample_format format;
                int default_driver;
                char *buffer;
                int buf_size;
                int sample;
                float freq = 440.0;
                ao_option * options = 0;
                int i;
                ao_info * info;
                
                ao_initialize();

                default_driver = ao_driver_id("alsa09");
                info = ao_driver_info(default_driver);
                printf("short_name=%s", info->short_name);
                for (i = 0; i < info->option_count; i++)
                        printf(" %s", info->options[i]);
                putchar('\n');

                assert(ao_append_option(&options, "dev", argv[1]));
                for (i = 2; argv[i] && argv[i + 1]; i += 2)
                        assert(ao_append_option(&options, argv[i], argv[i + 1]));

                format.bits = 16;
                format.channels = 2;
                format.rate = 44100;
                format.byte_format = AO_FMT_LITTLE;
                
                device = ao_open_live(default_driver, &format, options);
                if (device == NULL) {
                        fprintf(stderr, "Error opening device.\n");
                        return 1;
                }   
                
                buf_size = format.bits/8 * format.channels * format.rate;
                buffer = calloc(buf_size, sizeof(char));
                
                for (i = 0; i < format.rate; i++) {
                        sample = (int)(0.75 * 32768.0 * 
                                sin(2 * M_PI * freq * ((float) i/format.rate)));
                        
                        /* Put the same stuff in left and right channel */
                        buffer[4*i] = buffer[4*i+2] = sample & 0xff;
                        buffer[4*i+1] = buffer[4*i+3] = (sample >> 8) & 0xff;
                }
                assert(ao_play(device, buffer, buf_size));
                printf("played!\n");
                ao_close(device);
                ao_shutdown();
                return 0;
        }

The command "./a.out mplayer" beeps and says
        short_name=alsa09 dev buffer_time period_time
        played!
If I try "./a.out main" I get
        short_name=alsa09 dev buffer_time period_time
and then nothing.  Any ideas?  No values of buffer_time or
period_time that I could find got a beep out of pcm.main
(I listen to my MP3s with pytone which uses libao.) I am
using Linux 2.6.3-1-686 and Alsa 1.0.2c

> > How do I increase the buffering (latency) with the EX7?
> Try adding period_size and/or buffer_size entries to the slave
> definition (both values are in bytes).

As you can see I made up some values for period_size and buffer_size.
How do I find out the maximum values for these parameters? Aplay uses
period_size=2048 and buffer_size=4096 even if I put bigger values
in .asoundrc.  Perhaps these are thus the maximums. I cannot hear any
latency with these values.  Are these the best values to reduce clicks?
I haven't found anywhere to specify period_size and buffer_size for
pcm.mplayer.

thanks again
Stuart


-------------------------------------------------------
SF.Net is sponsored by: Speed Start Your Linux Apps Now.
Build and deploy apps & Web services for Linux with
a free DVD software kit from IBM. Click Now!
http://ads.osdn.com/?ad_id=1356&alloc_id=3438&op=click
_______________________________________________
Alsa-user mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-user

Reply via email to