Half-working ALSA backend - Alex
authorterminatorX <>
Sat, 22 Mar 2003 00:22:10 +0000 (00:22 +0000)
committerterminatorX <>
Sat, 22 Mar 2003 00:22:10 +0000 (00:22 +0000)
terminatorX/ChangeLog
terminatorX/src/tX_audiodevice.cc
terminatorX/src/tX_audiodevice.h
terminatorX/src/tX_dialog.cc
terminatorX/src/tX_glade_interface.cc
terminatorX/src/tX_global.c
terminatorX/terminatorX.glade

index 70d4c162dc3b6f42b65ff5a70934cb5ea8a937ea..7d5f7b7982220ef49fc3e58ebdfaff3cb76e911d 100644 (file)
@@ -7,11 +7,11 @@ changed.
 - Reworked the mastergui for better usabilty and less space consumption, yes,
   terminatorX now features a boring menubar - which helps using it on small
   displays quite a bit, and should be easier to handle for first time users.
-- Implemented a suggestions from Darrick Servis <darrick@dcn.davis.ca.us> that
+- Implemented a suggestion from Darrick Servis <darrick@dcn.davis.ca.us> that
   stops clipping in the mixer routine. The outgoing signal is now limited as it
   should be, which improves the output quality for signals too loud
   significantly.
-- MIDI mappings are now store with the (new) tX set files.
+- MIDI mappings are now stored within the (new) tX set files.
 - Applied a patch from Arthur Peters <amp@singingwizard.org> which brings
   preliminary MIDI support to terminatorX. This is realized via the ALSA
   sequencer interface, so in order for it to compile you have to have
index 431678e853e301c3f8056114096b53f5839b4c15..9f47aeeedf727b5ab9638cc05a92509b79af2760 100644 (file)
@@ -21,6 +21,8 @@
     Description: Implements Audiodevice handling... 
 */    
 
+#define ALSA_PCM_NEW_HW_PARAMS_API
+
 #include "tX_audiodevice.h"
 
 #include <sys/types.h>
@@ -50,44 +52,6 @@ void tX_audiodevice :: init()
        //set_buffersize_near(globals.audiodevice_buffersize);
 }
 
-
-void tX_audiodevice :: set_latency_near(int milliseconds)
-{
-       samples_per_buffer=(int) (((float) milliseconds) * 88.2);
-}
-
-int tX_audiodevice :: get_latency()
-{
-       return ((int) (((float) samples_per_buffer) / 88.2));
-}
-
-void tX_audiodevice :: set_buffersize_near(int samples)
-{
-       samples_per_buffer=samples;
-}
-
-int tX_audiodevice :: get_buffersize()
-{
-       return samples_per_buffer;
-}
-
-int tX_audiodevice :: open()
-{
-       fprintf(stderr, "tX: Error: tX_audiodevice::dev_open()\n");
-       return 1;
-}
-
-int tX_audiodevice :: close()
-{
-       fprintf(stderr, "tX: Error: tX_audiodevice::dev_close()\n");
-       return 1;
-}
-
-void tX_audiodevice :: play(int16_t* dummy)
-{
-       fprintf(stderr, "tX: Error: tX_audiodevice::play()\n");
-}
-
 #ifdef USE_OSS
 
 int tX_audiodevice_oss :: open()
@@ -103,7 +67,7 @@ int tX_audiodevice_oss :: open()
        buff_cfg=(globals.oss_buff_no<<16) | globals.oss_buff_size;
        p=buff_cfg;
 
-       tX_debug("tX_adudiodevice_oss::open() - buff_no: %i, buff_size: %i, buff_cfg: %08x", globals.buff_no, globals.buff_size, buff_cfg);
+       tX_debug("tX_adudiodevice_oss::open() - buff_no: %i, buff_size: %i, buff_cfg: %08x", globals.oss_buff_no, globals.oss_buff_size, buff_cfg);
                
        i = ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &p);
        ioctl(fd, SNDCTL_DSP_RESET, 0);         
@@ -127,10 +91,10 @@ int tX_audiodevice_oss :: open()
        
        i += ioctl(fd, SNDCTL_DSP_GETBLKSIZE, &blocksize);
 
-       tX_debug("tX_adudiodevice_oss::open() - blocksize: %i", blocksize);
-
        samples_per_buffer=blocksize/sizeof(int16_t);
        globals.true_block_size=samples_per_buffer/2;
+
+       tX_debug("tX_adudiodevice_oss::open() - blocksize: %i, samples_per_buffer: %i", blocksize, samples_per_buffer);
        
        ioctl(fd, SNDCTL_DSP_SYNC, 0);
 
@@ -157,6 +121,11 @@ tX_audiodevice_oss :: tX_audiodevice_oss()
        init();
 }
 
+double tX_audiodevice_oss :: get_latency()
+{
+       return 0;
+}
+
 void tX_audiodevice_oss :: play(int16_t *buffer)
 {
 #ifdef BIG_ENDIAN_MACHINE
@@ -186,7 +155,7 @@ int tX_audiodevice_alsa :: open()
        int device;
        
        sscanf(globals.alsa_device, "%i-%i: %s", &card, &device, foo);
-       sprintf(pcm_name, "plughw:%i,%i", card, device);
+       sprintf(pcm_name, "hw:%i,%i", card, device);
        
        if (snd_pcm_open(&pcm_handle, pcm_name, stream, 0) < 0) {
                tX_error("ALSA: Failed to access PCM device \"%s\"", pcm_name);
@@ -215,10 +184,10 @@ int tX_audiodevice_alsa :: open()
        }
        
        /* Setting sampling rate */
-       int hw_rate;
+       unsigned int hw_rate=(unsigned int)globals.alsa_samplerate;
        int dir;
        
-       hw_rate = snd_pcm_hw_params_set_rate_near(pcm_handle, hw_params, globals.alsa_samplerate, &dir);
+       int res = snd_pcm_hw_params_set_rate_near(pcm_handle, hw_params, &hw_rate, &dir);
        
        if (dir != 0) {
                tX_warning("ALSA: The PCM device \"%s\" doesnt support 44100 Hz playback - using %i instead", pcm_name, hw_rate);
@@ -232,17 +201,33 @@ int tX_audiodevice_alsa :: open()
        }
 
        /* Setting the number of buffers... */
-       if (snd_pcm_hw_params_set_periods(pcm_handle, hw_params, globals.alsa_buff_no, 0) < 0) {
+       /* if (snd_pcm_hw_params_set_periods(pcm_handle, hw_params, globals.alsa_buff_no, 0) < 0) {
                tX_error("ALSA: Failed to set %i periods for PCM device \"%s\"", globals.alsa_buff_no, pcm_name);
                snd_pcm_hw_params_free (hw_params);
                return -1;
-       }
+       } */
+
+       /* Setting the buffersize - ALSA cripples my mind, really... */
+       long unsigned int samples;
+       long unsigned int periodsize;
+
+       periodsize = globals.alsa_buff_size * 2;
        
-//     snd_pcm_sw_params_set_avail_min(pcm_handle, hw_params, samples);
-       int samples=snd_pcm_hw_params_set_buffer_size_near(pcm_handle, hw_params, globals.alsa_buff_size );
+       samples = snd_pcm_hw_params_set_buffer_size_near(pcm_handle, hw_params, &periodsize);
+       if (samples < 0) {
+               tX_error("ALSA: Failed to set buffersize %li", globals.alsa_buff_size);
+               return -1;
+       }
+
+       samples_per_buffer=periodsize;//hw_buffsize/sizeof(int16_t);
        
-       samples_per_buffer=samples;//hw_buffsize/sizeof(int16_t);
-       globals.true_block_size=samples*4;
+       periodsize /= 2;
+       if (snd_pcm_hw_params_set_period_size_near(pcm_handle, hw_params, &periodsize, 0) < 0) {
+               tX_error("ALSA: Failed to set periodsize %li", periodsize);
+               return -1;
+       }
+
+       globals.true_block_size=periodsize;
        
        /* Apply all that setup work.. */
        if (snd_pcm_hw_params(pcm_handle, hw_params) < 0) {
@@ -251,6 +236,8 @@ int tX_audiodevice_alsa :: open()
                return -1;
        }
        
+       tX_debug("ALSA: samples_per_buffer: %i, bs: %i, period=%i", samples_per_buffer, globals.true_block_size, periodsize);
+       
        snd_pcm_hw_params_free (hw_params);
        return 0;
 }
@@ -262,6 +249,12 @@ int tX_audiodevice_alsa :: close()
        return 0;
 }
 
+double tX_audiodevice_alsa :: get_latency()
+{
+       return 0;
+}
+
+
 tX_audiodevice_alsa :: tX_audiodevice_alsa()
 {
        pcm_handle=NULL;        
@@ -280,7 +273,7 @@ void tX_audiodevice_alsa :: play(int16_t *buffer)
        while (pcmreturn==-EPIPE) {
                snd_pcm_prepare(pcm_handle);
                pcmreturn=snd_pcm_writei(pcm_handle, buffer, samples_per_buffer/2);
-               tX_warning("ALSA: ** buffer underrun **");
+               //tX_warning("ALSA: ** buffer underrun **");
        }
        
        if (pcmreturn<0) {
index b7bb5ef3fcb7c7910b99ff92b9d23ca3decb7639..76f19294ac76f39442b0e077664d3341f75b0dd7 100644 (file)
@@ -44,16 +44,13 @@ class tX_audiodevice
        void init();
        
        public:
-       void set_latency_near(int milliseconds);
-       int get_latency(); /* call only valid *after* open() */
+       virtual double get_latency()=0; /* call only valid *after* open() */
+       int get_buffersize() { return samples_per_buffer; } /* call only valid *after* open() */
        
-       void set_buffersize_near(int samples);
-       int get_buffersize(); /* call only valid *after* open() */
-       
-       virtual int open();
-       virtual int close();
+       virtual int open()=0;
+       virtual int close()=0;
                
-       virtual void play(int16_t*); /* play blocked */
+       virtual void play(int16_t*)=0; /* play blocked */
 };
 
 
@@ -67,7 +64,9 @@ class tX_audiodevice_oss : public tX_audiodevice
        public:
        virtual int open();
        virtual int close();
-               
+       
+       virtual double get_latency(); /* call only valid *after* open() */
+       
        virtual void play(int16_t*); /* play blocked */
        
        tX_audiodevice_oss();
@@ -86,6 +85,8 @@ class tX_audiodevice_alsa : public tX_audiodevice
        virtual int open();
        virtual int close();
                
+       virtual double get_latency(); /* call only valid *after* open() */
+
        virtual void play(int16_t*); /* play blocked */
        
        tX_audiodevice_alsa();
index b146b5a209121d5055ccaf7feba9390dd05356ec..c3f52fa4affd24e17e23a54afde102e427bb2fcf 100644 (file)
@@ -435,17 +435,11 @@ void show_about(int nag)
        
        style = gtk_widget_get_style( window );
 
-       if (!pmap)
-       {
-               pmap=gdk_pixmap_create_from_xpm_d(window->window, &mask, &style->bg[GTK_STATE_NORMAL], (gchar **)logo_xpm );
-       }
-
+       pmap=gdk_pixmap_create_from_xpm_d(window->window, &mask, &style->bg[GTK_STATE_NORMAL], (gchar **)logo_xpm);
 
        pwid = gtk_pixmap_new( pmap, mask );
        
-       gtk_widget_show( pwid );
-
-       printf("pixmap: %08x.\n", pwid);
+       printf("pixmap: %08x %08x.\n", pwid, pmap);
        
        if (nag) {
                GtkWidget *box=gtk_vbox_new(FALSE, 2);
@@ -469,6 +463,7 @@ void show_about(int nag)
                gtk_widget_show(box2);
                gtk_widget_show(box);
                gtk_widget_show(window);
+               gtk_widget_show(pwid);
                
                while (gtk_events_pending()) gtk_main_iteration();      
        }
@@ -582,6 +577,8 @@ void show_about(int nag)
        gtk_widget_show(window);
        tX_set_icon(window, "tX About");
        
+       while (gtk_events_pending()) gtk_main_iteration();
+               
        about=window;
 }
 
index fa824424ed63b86bf2a19b44e47e81c193d9ea7b..ee852eab2d7ba268d6c9e389010ec16300546950 100644 (file)
@@ -346,7 +346,7 @@ create_tx_options (void)
   combo_entry5 = GTK_COMBO (alsa_samplerate)->entry;
   gtk_widget_show (combo_entry5);
 
-  alsa_buffersize = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (1024, 512, 32000, 512, 1024, 2048)));
+  alsa_buffersize = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (1024, 64, 512, 32, 64, 64)));
   gtk_widget_show (alsa_buffersize);
   gtk_table_attach (GTK_TABLE (table6), alsa_buffersize, 1, 2, 2, 3,
                     (GtkAttachOptions) (GTK_FILL),
index 01e04c7abf883716c7cb9f2d70f5348f08135997..49b2272445a08d55f6fb6a07df108aa5d3ab3284 100644 (file)
@@ -79,7 +79,7 @@ void set_global_defaults() {
        globals.oss_buff_size=9;
        globals.oss_samplerate=44100;
 
-       strcpy(globals.alsa_device, "plughw:0,0");      
+       strcpy(globals.alsa_device, "hw:0,0");  
        globals.alsa_buff_no=2;
        globals.alsa_buff_size=1024;
        globals.alsa_samplerate=44100;
@@ -323,6 +323,6 @@ char *encode_xml(char *dest, const char *src) {
        }
        dest[t]=0;
        
-       tX_debug("encode_xml: from \"%s\" to \"%s\".", src, dest); 
+       //tX_debug("encode_xml: from \"%s\" to \"%s\".", src, dest); 
        return dest;
 }
index 5dd181d1b9a016ec57292370b1c6bbee9aa03ed0..858da335f8d1acda7bfcc98a7899400d422bb942 100644 (file)
                  <property name="digits">0</property>
                  <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
                  <property name="inverted">False</property>
-                 <property name="adjustment">1024 512 32000 512 1024 2048</property>
+                 <property name="adjustment">1024 64 512 32 64 64</property>
                </widget>
                <packing>
                  <property name="left_attach">1</property>