OSDN Git Service

New updated mixer interface and better protocol handling...
authorJaroslav Kysela <perex@perex.cz>
Mon, 24 Aug 1998 16:23:22 +0000 (16:23 +0000)
committerJaroslav Kysela <perex@perex.cz>
Mon, 24 Aug 1998 16:23:22 +0000 (16:23 +0000)
include/config.h
include/mixer.h
include/soundlib.h
include/version.h
src/control/control.c
src/mixer/mixer.c
src/pcm/pcm.c

index b684579..103f198 100644 (file)
@@ -3,5 +3,5 @@
  *  Configuration header file for compilation of the ALSA driver
  */
 
-#define SND_LIB_VERSION "0.0.9"
+#define SND_LIB_VERSION "0.0.10"
 /* #undef WORDS_BIGENDIAN */
index 38c0024..b4026d3 100644 (file)
@@ -8,7 +8,8 @@
 typedef struct snd_mixer_callbacks {
   void *private_data;          /* should be used by application */
   void (*channel_was_changed)( void *private_data, int channel );
-  void *reserved[15];          /* reserved for future use - must be NULL!!! */
+  void (*switch_was_changed)( void *private_data, int switchn );
+  void *reserved[14];          /* reserved for future use - must be NULL!!! */
 } snd_mixer_callbacks_t;
  
 #ifdef __cplusplus
@@ -25,8 +26,9 @@ int snd_mixer_channel( void *handle, const char *channel_id );
 int snd_mixer_channel_info( void *handle, int channel, snd_mixer_channel_info_t *info );
 int snd_mixer_channel_read( void *handle, int channel, snd_mixer_channel_t *data );
 int snd_mixer_channel_write( void *handle, int channel, snd_mixer_channel_t *data );
-int snd_mixer_special_read( void *handle, snd_mixer_special_t *special );
-int snd_mixer_special_write( void *handle, snd_mixer_special_t *special );
+int snd_mixer_switches( void *handle );
+int snd_mixer_switch_read( void *handle, int switchn, snd_mixer_switch_t *data );
+int snd_mixer_switch_write( void *handle, int switchn, snd_mixer_switch_t *data );
 int snd_mixer_read( void *handle, snd_mixer_callbacks_t *callbacks );
 
 #ifdef __cplusplus
index 681fe40..fa84519 100644 (file)
@@ -31,7 +31,7 @@
 
 #define SOUNDLIB_VERSION_MAJOR         0
 #define SOUNDLIB_VERSION_MINOR         0
-#define SOUNDLIB_VERSION_SUBMINOR      9
+#define SOUNDLIB_VERSION_SUBMINOR      10
 #define SOUNDLIB_VERSION               ( ( LIBULTRA_VERSION_MAJOR << 16 ) | ( LIBULTRA_VERSION_MINOR << 8 ) | LIB_ULTRA_VERSION_SUBMINOR )
 
 /*
@@ -89,7 +89,8 @@ int snd_ctl_mixer_info( void *handle, int dev, snd_mixer_info_t *info );
 typedef struct snd_mixer_callbacks {
   void *private_data;          /* should be used by application */
   void (*channel_was_changed)( void *private_data, int channel );
-  void *reserved[15];          /* reserved for future use - must be NULL!!! */
+  void (*switch_was_changed)( void *private_data, int switchn );
+  void *reserved[14];          /* reserved for future use - must be NULL!!! */
 } snd_mixer_callbacks_t;
  
 #ifdef __cplusplus
@@ -106,8 +107,9 @@ int snd_mixer_channel( void *handle, const char *channel_id );
 int snd_mixer_channel_info( void *handle, int channel, snd_mixer_channel_info_t *info );
 int snd_mixer_channel_read( void *handle, int channel, snd_mixer_channel_t *data );
 int snd_mixer_channel_write( void *handle, int channel, snd_mixer_channel_t *data );
-int snd_mixer_special_read( void *handle, snd_mixer_special_t *special );
-int snd_mixer_special_write( void *handle, snd_mixer_special_t *special );
+int snd_mixer_switches( void *handle );
+int snd_mixer_switch_read( void *handle, int switchn, snd_mixer_switch_t *data );
+int snd_mixer_switch_write( void *handle, int switchn, snd_mixer_switch_t *data );
 int snd_mixer_read( void *handle, snd_mixer_callbacks_t *callbacks );
 
 #ifdef __cplusplus
index 8e0e73c..8c777ae 100644 (file)
@@ -4,6 +4,6 @@
 
 #define SOUNDLIB_VERSION_MAJOR         0
 #define SOUNDLIB_VERSION_MINOR         0
-#define SOUNDLIB_VERSION_SUBMINOR      9
+#define SOUNDLIB_VERSION_SUBMINOR      10
 #define SOUNDLIB_VERSION               ( ( LIBULTRA_VERSION_MAJOR << 16 ) | ( LIBULTRA_VERSION_MINOR << 8 ) | LIB_ULTRA_VERSION_SUBMINOR )
 
index 6debff6..a46ca0f 100644 (file)
@@ -49,7 +49,8 @@ int snd_ctl_open( void **handle, int card )
     close( fd );
     return -errno;
   }
-  if ( ver > SND_CTL_VERSION_MAX ) return -SND_ERROR_UNCOMPATIBLE_VERSION;
+  if ( SND_PROTOCOL_UNCOMPATIBLE( ver, SND_CTL_VERSION_MAX ) )
+    return -SND_ERROR_UNCOMPATIBLE_VERSION;
   ctl = (snd_ctl_t *)calloc( 1, sizeof( snd_ctl_t ) );
   if ( ctl == NULL ) {
     close( fd );
index 3f973ac..1cc3aef 100644 (file)
@@ -29,7 +29,7 @@
 #include "soundlib.h"
 
 #define SND_FILE_MIXER         "/dev/sndmixer%i%i"
-#define SND_CTL_VERSION_MAX    SND_PROTOCOL_VERSION( 1, 0, 0 )
+#define SND_MIXER_VERSION_MAX  SND_PROTOCOL_VERSION( 1, 0, 1 )
  
 typedef struct {
   int card;
@@ -51,7 +51,8 @@ int snd_mixer_open( void **handle, int card, int device )
     close( fd );
     return -errno;
   }
-  if ( ver > SND_CTL_VERSION_MAX ) return -SND_ERROR_UNCOMPATIBLE_VERSION;
+  if ( SND_PROTOCOL_UNCOMPATIBLE( ver, SND_MIXER_VERSION_MAX ) )
+    return -SND_ERROR_UNCOMPATIBLE_VERSION;
   mixer = (snd_mixer_t *)calloc( 1, sizeof( snd_mixer_t ) );
   if ( mixer == NULL ) {
     close( fd );
@@ -176,24 +177,59 @@ int snd_mixer_channel_write( void *handle, int channel, snd_mixer_channel_t *dat
   return 0;
 }
 
-int snd_mixer_special_read( void *handle, snd_mixer_special_t *special )
+int snd_mixer_switches( void *handle )
 {
   snd_mixer_t *mixer;
+  int result;
   
   mixer = (snd_mixer_t *)handle;
   if ( !mixer ) return -EINVAL;
-  if ( ioctl( mixer -> fd, SND_MIXER_IOCTL_SPECIAL_READ, special ) < 0 )
+  if ( ioctl( mixer -> fd, SND_MIXER_IOCTL_SWITCHES, &result ) < 0 )
+    return -errno;
+  return result;
+}
+
+int snd_mixer_switch( void *handle, const char *switch_id )
+{
+  snd_mixer_t *mixer;
+  snd_mixer_switch_t uswitch;
+  int idx, switches, err;
+  
+  mixer = (snd_mixer_t *)handle;
+  if ( !mixer ) return -EINVAL;
+  /* bellow implementation isn't optimized for speed */
+  /* info about switches should be cached in the snd_mixer_t structure */
+  if ( (switches = snd_mixer_switches( handle )) < 0 )
+    return switches;
+  for ( idx = 0; idx < switches; idx++ ) {
+    if ( (err = snd_mixer_switch_read( handle, idx, &uswitch )) < 0 )
+      return err;
+    if ( !strncmp( switch_id, uswitch.name, sizeof( uswitch.name ) ) )
+      return idx;
+  }
+  return -EINVAL;
+}
+
+int snd_mixer_switch_read( void *handle, int switchn, snd_mixer_switch_t *data )
+{
+  snd_mixer_t *mixer;
+  
+  mixer = (snd_mixer_t *)handle;
+  if ( !mixer ) return -EINVAL;
+  data -> switchn = switchn;
+  if ( ioctl( mixer -> fd, SND_MIXER_IOCTL_SWITCH_READ, data ) < 0 )
     return -errno;
   return 0;
 }
 
-int snd_mixer_special_write( void *handle, snd_mixer_special_t *special )
+int snd_mixer_switch_write( void *handle, int switchn, snd_mixer_switch_t *data )
 {
   snd_mixer_t *mixer;
   
   mixer = (snd_mixer_t *)handle;
   if ( !mixer ) return -EINVAL;
-  if ( ioctl( mixer -> fd, SND_MIXER_IOCTL_SPECIAL_WRITE, special ) < 0 )
+  data -> switchn = switchn;
+  if ( ioctl( mixer -> fd, SND_MIXER_IOCTL_SWITCH_WRITE, data ) < 0 )
     return -errno;
   return 0;
 }
@@ -217,6 +253,9 @@ int snd_mixer_read( void *handle, snd_mixer_callbacks_t *callbacks )
       if ( cmd == 0 && callbacks -> channel_was_changed ) {        
         callbacks -> channel_was_changed( callbacks -> private_data, (int)tmp );
       }
+      if ( cmd == 1 && callbacks -> switch_was_changed ) {
+        callbacks -> switch_was_changed( callbacks -> private_data, (int)tmp );
+      }
     }
     count += result >> 3;      /* return only number of changes */
   }
index 9687f7d..470b9f7 100644 (file)
@@ -12,7 +12,7 @@
 #include "soundlib.h"
 
 #define SND_FILE_PCM           "/dev/sndpcm%i%i"
-#define SND_CTL_VERSION_MAX    SND_PROTOCOL_VERSION( 1, 0, 0 )
+#define SND_PCM_VERSION_MAX    SND_PROTOCOL_VERSION( 1, 0, 0 )
  
 typedef struct {
   int card;
@@ -34,7 +34,8 @@ int snd_pcm_open( void **handle, int card, int device, int mode )
     close( fd );
     return -errno;
   }
-  if ( ver > SND_CTL_VERSION_MAX ) return -SND_ERROR_UNCOMPATIBLE_VERSION;
+  if ( SND_PROTOCOL_UNCOMPATIBLE( ver, SND_PCM_VERSION_MAX ) )
+    return -SND_ERROR_UNCOMPATIBLE_VERSION;
   pcm = (snd_pcm_t *)calloc( 1, sizeof( snd_pcm_t ) );
   if ( pcm == NULL ) {
     close( fd );