ao_arts.c.diff
Код: Выделить всё
13,15c13,16
< #include "audio_out.h"
< #include "audio_out_internal.h"
< #include "afmt.h"
---
> #include <sys/ioctl.h>
> #include <sys/soundcard.h>
> #include <fcntl.h>
>
18a20,24
> #include "afmt.h"
>
> #include "audio_out.h"
> #include "audio_out_internal.h"
>
37c43,75
< static int control(int cmd, void *arg)
---
>
>
> static int MIXER_CHANNEL = SOUND_MIXER_VOLUME;
> static int MIXER_DEV_MASK = 1 << SOUND_MIXER_VOLUME;
> static int MIXER_CHANNEL_ALT = SOUND_MIXER_PCM;
> static int MIXER_DEV_MASK_ALT = 1 << SOUND_MIXER_PCM;
>
> static int artsd_get_volume(int *l, int *r)
> {
> int fd, v, cmd, devs;
> fd = open(PATH_DEV_MIXER, O_RDONLY);
> if (fd != -1)
> {
> ioctl(fd, SOUND_MIXER_READ_DEVMASK, &devs);
> if (devs & MIXER_DEV_MASK)
> cmd = MIXER_READ (MIXER_CHANNEL);
> else if (devs & MIXER_DEV_MASK_ALT)
> cmd = MIXER_READ (MIXER_CHANNEL_ALT);
> else
> {
> close(fd);
> return CONTROL_UNKNOWN;
> }
> ioctl(fd, cmd, &v);
> *r = (v & 0xFF00) >> 8;
> *l = (v & 0x00FF);
> close(fd);
> return CONTROL_OK;
> }
> return CONTROL_UNKNOWN;
> }
>
> static int artsd_set_volume(int l, int r)
39c77,98
< return(CONTROL_UNKNOWN);
---
> int fd, v, cmd, devs;
>
> fd = open(PATH_DEV_MIXER, O_RDONLY);
>
> if (fd != -1)
> {
> ioctl(fd, SOUND_MIXER_READ_DEVMASK, &devs);
> if (devs & MIXER_DEV_MASK)
> cmd = MIXER_WRITE(MIXER_CHANNEL);
> else if (devs & MIXER_DEV_MASK_ALT)
> cmd = MIXER_WRITE(MIXER_CHANNEL_ALT);
> else
> {
> close(fd);
> return CONTROL_UNKNOWN;
> }
> v = (r << 8) | l;
> ioctl(fd, cmd, &v);
> close(fd);
> return CONTROL_OK;
> }
> return CONTROL_UNKNOWN;
41a101,127
>
> // to set/get/query special features/parameters
> static int control(int cmd, void *arg){
> switch(cmd){
> case AOCONTROL_QUERY_FORMAT:
> return CONTROL_TRUE;
> case AOCONTROL_GET_VOLUME:
> case AOCONTROL_SET_VOLUME:
> {
> ao_control_vol_t *vol = (ao_control_vol_t *)arg;
>
> if(ao_data.format == AFMT_AC3)
> return CONTROL_TRUE;
> if (cmd == AOCONTROL_SET_VOLUME){
> return artsd_set_volume(vol->left, vol->right);
> }
> int l, r;
> int result= artsd_get_volume(&l, &r);
> vol->left=l; vol->right=r;
> return result;
> }
> }
> return CONTROL_UNKNOWN;
> }
>
>
>
100a187
>

протещено на mplayer 1.0pre4 и pre5, фунциклирует.
в след. строках:
Код: Выделить всё
> static int MIXER_CHANNEL = SOUND_MIXER_VOLUME;
> static int MIXER_DEV_MASK = 1 << SOUND_MIXER_VOLUME;
> static int MIXER_CHANNEL_ALT = SOUND_MIXER_PCM;
> static int MIXER_DEV_MASK_ALT = 1 << SOUND_MIXER_PCM;
вроде все фунциклирует...[/code]