mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-10-29 05:40:25 -04:00
New updated mixer interface and better protocol handling...
This commit is contained in:
parent
e093a81e5e
commit
44582b2fbe
7 changed files with 63 additions and 18 deletions
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 )
|
||||
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
|
|
|||
|
|
@ -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_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;
|
||||
if ( ioctl( mixer -> fd, SND_MIXER_IOCTL_SPECIAL_READ, special ) < 0 )
|
||||
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 */
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue