таки mplayer && arts

Все о программировании под *nix
Foxx
Неотъемлемая часть форума
Сообщения: 435
Зарегистрирован: 03 апр 2004, 17:05
Контактная информация:

таки mplayer && arts

Сообщение Foxx »

Если кому-то интересно, как впаять в mplayer регулировку звука при выводе в arts-систему, предлагаю только что родившийся патч:

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
> 	 
идея выколупана из tvtime 8)
протещено на 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;
CHANNEL и CHANNEL_ALT для саундкарт с хардварным PCM регулятором громкости лучше будет нарна поменять местами... в смысле чтобы CHANNEL=SOUND_MIXER_PCM, и соотв. DEV_MASK его = 1<< SOUND_MIXER_PCM. у кого CMI9739 или аналог intel8x0 без PCM оставлять так как есть.

вроде все фунциклирует...[/code]