
//Source for a wamixer test program capable to change all mixer registers
// in real time...
//Woody, April 1998

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/errno.h>
#include <fcntl.h>
#include <linux/soundcard.h>

#define	MIXER_PRIVATE3_RESET	0x53570000
#define	MIXER_PRIVATE3_READ	0x53570001
#define	MIXER_PRIVATE3_WRITE	0x53570002

int mixer_fd=-1;
unsigned supported;
int source;

int	mixer_regs[15];


main(int argc, char *argv[])
{	unsigned int r, d;



    mixer_fd=open("/dev/mixer",O_RDWR);
    if(mixer_fd<0){
      perror("wamixer: Mixer not found!");
      exit(-1);
    }
    mixer_regs[0x0E] = MIXER_PRIVATE3_READ;
    source = &mixer_regs;

    source = ioctl(mixer_fd,SOUND_MIXER_PRIVATE3,&source);

    if (source < 0)
        printf("Mixer Private read returned error 0x%X!\n", source);   

    if (argc == 1)
    {
	printf("0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014\n");
	for (r=0; r<14; r++)
		printf("%04X ", mixer_regs[r]);
	printf("\n");
    }
	else if (argc%2 == 1)
	{
		while (argc > 1) {
			r = atoi(argv[1]);
			sscanf(argv[2], "%i", &d);
			printf("Register %d <- %04X\n", r, d);
			mixer_regs[r-1] = d;
			argc -= 2;
			argv += 2;
		}

	    mixer_regs[0x0E] = MIXER_PRIVATE3_WRITE;
	    source = &mixer_regs;

	    source = ioctl(mixer_fd,SOUND_MIXER_PRIVATE3,&source);

	    if (source < 0)
	        printf("Mixer Private write returned error 0x%X!\n", source);   

	}
	else {
		printf("usage: wamixer                       - dump registers\n");
		printf("       wamixer reg val [reg val ...] - program WA mixer register\n");
		printf("                  reg is decimal, value is hex (0x..) or decimal\n");
		printf("       For example:-\n");
		printf("       wamixer 9 0x982D  4 0x4C08  8 0x8C08\n");
		exit(1);
	}

	close(mixer_fd);

}


