Update of /cvsroot/alsa/alsa-oss/test
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16922/test

Modified Files:
        .cvsignore Makefile.am mmap_test.c 
Added Files:
        lmixer.cc mixctl.h testaoss.in 
Log Message:
- fixed oss wrapper mixer open bug (missing code)
- added lmixer to test directory
- ported mmap_test to use oss redirector
- don't compile code != libalsatoss with -lasound


--- NEW FILE: lmixer.cc ---
//  lmixer
//  
//  Written by Brandon Zehm
//  [EMAIL PROTECTED]
//
//  This software is released under the GNU GPL license.
//  For details see http://www.gnu.org/copyleft/gpl.html
//
//  If you have patches, suggestions, comments, or anything
//  else to tell me, please feel free to email me.
//

#define MIXERVERSION "1.0.7"
#define MIXERDEV    "/dev/mixer"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "mixctl.h"


// Initialize functions
void help();
void version();
void scanArgs(int argc, char **argv);
void ShowChannelInfo();
int VerifyChannelName();
int open_mixer();


// Define Variables
char mixdev[256]=MIXERDEV;    // The var with the mixer device
int volume=255;               // Set volume to a value out of range
int channel=255;              // Set channel to a value out of range
char channel_name[32]="BLANK";  // 

// Initialize interface to mixer.h
MixCtl *mixctl;






////////////////////////////////////////////////////////
// Sub:         main()
// Input:       argc and **argv
////////////////////////////////////////////////////////
int main(int argc, char **argv)
{
   // Get command line parameters.
   scanArgs(argc, argv);
   
   // If neither the volume or the channel got set print help.
   if ((volume == 255) && (channel == 255)) {
     help();
     exit(1);
   }
   
   // Check to see if the volume got set
   if (volume == 255) {
     printf ("You must set a volume!\n");
     help();
     exit(1);
   }
   
   // Check to see if the volume got set
   if(strcmp(channel_name, "BLANK")==0) {
     printf ("You must set a mixer channel!\n");
     help();
     exit(1);
   }
   
   
   // If we get here we assume we are doing the defualt operation
   // which is: 
   //            1. open mixer 
   //            2. write volume to a channel
   //            3. quit
   
   
   // Open the mixer or die
   if (open_mixer() != 1) {
     exit(1);
   } 
   
   // Verify that the incoming channel_name is valid
   // and set 'channel' to the corresponding channel number.
   if (VerifyChannelName() == 0) {
     printf("\'%s\' is not a valid channel name!\n", channel_name);
     exit(1);
   }
   
   // Write the volume
   mixctl->setBoth(channel,volume,volume);
   mixctl->writeVol(channel);
   
   
   // Exit
   delete mixctl;
   return 0;
}










////////////////////////////////////////////////////////
// Sub:         scanArgs()
// Input:       argc and *argv
// Output:      Sets initial variables
// Description: Receives incoming data and directs 
//              the flow of the program.
////////////////////////////////////////////////////////
void scanArgs(int argc, char *argv[]){
   for(int i=1;i<argc;i++){
      // Help
      if(strcmp(argv[i], "-h")==0 || strcmp(argv[i], "--help")==0){
        help();
        exit(0);
      }
      // Set Mixer Device
      if(strcmp(argv[i], "-d")==0 || strcmp(argv[i], "--device")==0){
        if(i<argc-1){
          i++;
          sprintf(mixdev, "%s", argv[i]);
        }
        continue;
      }
      // Set new volume
      if(strcmp(argv[i], "-v")==0 || strcmp(argv[i], "--volume")==0){
        if(i<argc-1){
          i++;
          volume = atoi(argv[i]);
        }
        continue;
      }
      // Set new mixer channel
      if(strcmp(argv[i], "-c")==0 || strcmp(argv[i], "--channel")==0){
        if(i<argc-1){
          i++;
          sprintf(channel_name, "%s", argv[i]);
        }
        continue;
      }
      // Show mixer information
      if(strcmp(argv[i], "-i")==0 || strcmp(argv[i], "--info")==0){
        if (open_mixer() != 1) {
          exit(1);
        }
        ShowChannelInfo();
        exit(0);
      }
      // Show version information
      if(strcmp(argv[i], "-V")==0 || strcmp(argv[i], "--version")==0){
        version();
        exit(0);
      }
   }
}






//////////////////////////////////////////////////////////
// Sub:         Help()
// Input:       void
// Output:      
// Description: Prints the help message.
/////////////////////////////////////////////////////////
void help() {
  printf("\n");
  printf("lmixer v%s\n", MIXERVERSION);
  printf("                                                                       \n");
  printf("Usage:   lmixer [options]                                              \n");
  printf("                                                                       \n");
  printf(" -c,--channel   <channel name>   Mixer channel to adjust               \n");
  printf(" -v,--volume    <volume>         Volume (1-100)                        \n");
  printf(" -d,--device    <mixer device>   Use specified mixer device            \n");
  printf(" -i,--info                       Shows the volume of each mixer device \n");
  printf(" -V,--version                    Display version information           \n");
  printf(" -h,--help                       Display this help screen              \n");
  printf("                                                                       \n");
  printf("Typical useage:  'lmixer -c bass -v 85'                                \n");
  printf("\n");
}



//////////////////////////////////////////////////////////
// Sub:         version()
// Input:       void
// Description: Prints version informaion
/////////////////////////////////////////////////////////
void version() {
  printf("lmixer version %s\n", MIXERVERSION);
}
 



////////////////////////////////////////////////////////
// Sub:         open_mixer()
// Input:       int
// Output:      Returns 1 on success 0 on failure.
// Description: Opens the mixer device or dies.
////////////////////////////////////////////////////////
int open_mixer () {
   // Open the mixer, and verify it worked.
   mixctl=new MixCtl(mixdev);
   if(!mixctl->openOK()) {
      fprintf(stdout,"Unable to open mixer device: %s\n", mixdev);
      return(0);
   }
   return(1);
}






////////////////////////////////////////////////////////
// Sub:         ShowChannelInfo()
// Input:       void
// Output:      STDOUT
// Description: Shows a list of channels and their 
//              current volumes.
////////////////////////////////////////////////////////
void ShowChannelInfo () {
  for (int i = 0; i < mixctl->getNrDevices(); i++) {            // For every device,
    if (mixctl->getSupport(i)) {                                // if the device 
exists,
      volume = mixctl->readVol(i,1);                            // Get the volume
      printf ("%s\t%d\n", mixctl->getName(i), volume);          // and print a line.
    }
  }
}



////////////////////////////////////////////////////////
// Sub:         VerifyChannelName()
// Input:       Reads global var channel_name
// Output:      returns a 1 on success 0 on failure
// Description: Checks to see if 'channel_name' is
//              a valid mixer device, and if it
//              is it sets 'channel' to the number of
//              that device.
////////////////////////////////////////////////////////
int VerifyChannelName () {
  for (int i = 0; i < mixctl->getNrDevices(); i++) {            // For every device,
    if (mixctl->getSupport(i)) {                                // if the device 
exists,
      if(strcmp(channel_name, mixctl->getName(i))==0) {
        channel = i;
        return 1;
      }
    }
  }
  return 0;
}











--- NEW FILE: mixctl.h ---
// mixctl.h - MixCtl class provides control of audio mixer functions
// 05/09/98  Release 1.0 Beta1
// Copyright (C) 1998  Sam Hawker <[EMAIL PROTECTED]>
// This software comes with ABSOLUTELY NO WARRANTY
// This software is free software, and you are welcome to redistribute it.

// Although mixctl.h is an integral part of lmixer, it may also be distributed 
seperately.

#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#ifdef __NetBSD__
#include <soundcard.h>
#endif
#ifdef __FreeBSD__
#include <machine/soundcard.h>
#endif
#ifdef __linux__
#include <linux/soundcard.h>
#endif
#include <oss-redir.h>

class MixCtl
{
public:
   MixCtl(char *dname){
      device=(char *)malloc(sizeof(char)*(strlen(dname)+1));
      strcpy(device,dname);
      if(mixfdopen=(mixfd=oss_mixer_open(device,O_RDONLY | O_NONBLOCK))!=-1){
         nrdevices=SOUND_MIXER_NRDEVICES;
         char *devnames[]=SOUND_DEVICE_NAMES;
         char *devlabels[]=SOUND_DEVICE_LABELS;
         if (oss_mixer_ioctl(mixfd, SOUND_MIXER_READ_DEVMASK, &devmask)<0)
           fprintf(stderr, "SOUND_MIXER_READ_DEVMASK failed\n");
         if (oss_mixer_ioctl(mixfd, SOUND_MIXER_READ_STEREODEVS, &stmask)<0)
           fprintf(stderr, "SOUND_MIXER_READ_STEREODEVS failed\n");
         if (oss_mixer_ioctl(mixfd, SOUND_MIXER_READ_RECMASK, &recmask)<0)
           fprintf(stderr, "SOUND_MIXER_READ_RECMASK failed\n");
         if (oss_mixer_ioctl(mixfd, SOUND_MIXER_READ_CAPS, &caps)<0)
           fprintf(stderr, "SOUND_MIXER_READ_CAPS failed\n");
         mixdevs=(struct MixDev *)malloc(sizeof(struct MixDev)*nrdevices);
         int mixmask=1;
         for(int i=0;i<nrdevices;i++){
            mixdevs[i].support=devmask & mixmask;
            mixdevs[i].stereo=stmask & mixmask;
            mixdevs[i].records=recmask & mixmask;
            mixdevs[i].mask=mixmask;
            mixdevs[i].name=devnames[i];
            mixdevs[i].label=devlabels[i];
            mixmask*=2;
         }
         doStatus();
      }
   }
   ~MixCtl(){
      if(mixfdopen){
         if(mixdevs!=NULL)
            free(mixdevs);
         oss_mixer_close(mixfd);
      }
   }
   bool openOK(){
      return mixfdopen;
   }
   void doStatus(){
      oss_mixer_ioctl(mixfd, SOUND_MIXER_READ_RECSRC, &recsrc);
      for(int i=0;i<nrdevices;i++){
         if(mixdevs[i].support)
            oss_mixer_ioctl(mixfd, MIXER_READ(i), &mixdevs[i].value);
         mixdevs[i].recsrc=(recsrc & mixdevs[i].mask);
      }
   }

   // Return volume for a device, optionally reading it from device first.
   // Can be used as a way to avoid calling doStatus().
   int readVol(int dev, bool read){
      if(read)
         oss_mixer_ioctl(mixfd, MIXER_READ(dev), &mixdevs[dev].value);
      return mixdevs[dev].value/256;
   }

   // Return left and right componenets of volume for a device.
   // If you are lazy, you can call readVol to read from the device, then these
   // to get left and right values.
   int readLeft(int dev){
      return mixdevs[dev].value%256;
   }
   int readRight(int dev){
      return mixdevs[dev].value/256;
   }

   // Write volume to device. Use setVolume, setLeft and setRight first.
   void writeVol(int dev){
      oss_mixer_ioctl(mixfd, MIXER_WRITE(dev), &mixdevs[dev].value);
   }

   // Set volume (or left or right component) for a device. You must call writeVol to 
write it.
   void setVol(int dev, int value){
      mixdevs[dev].value=value;
   }
   void setBoth(int dev, int l, int r){
      mixdevs[dev].value=256*r+l;
   }
   void setLeft(int dev, int l){
      int r;
      if(mixdevs[dev].stereo)
         r=mixdevs[dev].value/256;
      else
         r=l;
      mixdevs[dev].value=256*r+l;
   }
   void setRight(int dev, int r){
      int l;
      if(mixdevs[dev].stereo)
         l=mixdevs[dev].value%256;
      else
         l=r;
      mixdevs[dev].value=256*r+l;
   }

   // Return record source value for a device, optionally reading it from device first.
   bool readRec(int dev, bool read){
      if(read){
         oss_mixer_ioctl(mixfd, SOUND_MIXER_READ_RECSRC, &recsrc);
         mixdevs[dev].recsrc=(recsrc & mixdevs[dev].mask);
      }
      return mixdevs[dev].recsrc;
   }

   // Write record source values to device. Use setRec first.
   void writeRec(){
      oss_mixer_ioctl(mixfd, SOUND_MIXER_WRITE_RECSRC, &recsrc);
   }

   // Make a device (not) a record source.
   void setRec(int dev, bool rec){
      if(rec){
         if(caps & SOUND_CAP_EXCL_INPUT)
            recsrc=mixdevs[dev].mask;
         else
            recsrc|=mixdevs[dev].mask;
      }
      else
         recsrc&=~mixdevs[dev].mask;
   }

   // Return various other info
   char *getDevName(){
      return device;
   }
   // Return the number of mixer devices..
   // note: check the validity of each with getSupport 
   // before using.
   int getNrDevices(){
      return nrdevices;
   }
   int getCapabilities(){
      return caps;
   }
   // Is this dev valid? 
   // Example: if (mixctl->getSupport(dev)) { "The channel is valid" }
   bool getSupport(int dev){
      return mixdevs[dev].support;
   }
   bool getStereo(int dev){
      return mixdevs[dev].stereo;
   }
   bool getRecords(int dev){
      return mixdevs[dev].records;
   }
   // Get the name of int dev.. 
   // example: printf("Channel %d's name is %s", channel, mixctl->getName(channel));
   char *getName(int dev){
      return mixdevs[dev].name;
   }
   char *getLabel(int dev){
      return mixdevs[dev].label;
   }

private:
   int mixfd;
   int mixfdopen;
   char *device;

   struct MixDev{
      bool support;
      bool stereo;
      bool recsrc;
      bool records;
      char *name;
      char *label;
      int value;
      int mask;
   };

   int nrdevices;       // maximum number of devices
   int devmask;         // supported devices
   int stmask;          // stereo devices
   int recmask;         // devices which can be recorded from
   int caps;            // capabilities
   int recsrc;          // devices which are being recorded from
   struct MixDev *mixdevs;
};

--- NEW FILE: testaoss.in ---
#!/bin/sh

# A simple script to facilitate the use of the OSS compatibility library.
# Usage:
#       testaoss <command> <command options and arguments>

[EMAIL PROTECTED]@
ALSA_OSS_WRAPPER=1 LD_PRELOAD=${prefix}/alsa/.libs/libaoss.so $*

Index: .cvsignore
===================================================================
RCS file: /cvsroot/alsa/alsa-oss/test/.cvsignore,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- .cvsignore  11 Feb 2004 19:31:20 -0000      1.1
+++ .cvsignore  12 Feb 2004 17:16:07 -0000      1.2
@@ -4,3 +4,4 @@
 .libs
 *.lo
 *.la
+testaoss

Index: Makefile.am
===================================================================
RCS file: /cvsroot/alsa/alsa-oss/test/Makefile.am,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Makefile.am 11 Feb 2004 19:31:20 -0000      1.1
+++ Makefile.am 12 Feb 2004 17:16:07 -0000      1.2
@@ -1,6 +1,8 @@
-check_PROGRAMS=mmap_test mmap_test_redir
+check_PROGRAMS=mmap_test lmixer
 
-mmap_test_redir_LDADD=../oss-redir/libossredir.la
+mmap_test_LDADD=../oss-redir/libossredir.la
+lmixer_LDADD=../oss-redir/libossredir.la
+lmixer_SOURCES=lmixer.cc
 
 INCLUDES=-I$(top_srcdir)/oss-redir
 CFLAGS=-static -Wall -pipe -g

Index: mmap_test.c
===================================================================
RCS file: /cvsroot/alsa/alsa-oss/test/mmap_test.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- mmap_test.c 11 Feb 2004 19:31:20 -0000      1.1
+++ mmap_test.c 12 Feb 2004 17:16:07 -0000      1.2
@@ -43,7 +43,7 @@
        fd_set writeset;

 

        close(0);

-       if ((fd=open("/dev/dsp", O_RDWR, 0))==-1)

+       if ((fd=oss_pcm_open("/dev/dsp", O_RDWR, 0))==-1)

        {

                perror("/dev/dsp");

                exit(-1);

@@ -53,7 +53,7 @@
  */

 

        tmp = 48000;

-       ioctl(fd, SNDCTL_DSP_SPEED, &tmp);

+       oss_pcm_ioctl(fd, SNDCTL_DSP_SPEED, &tmp);

        printf("Speed set to %d\n", tmp);

 

 /*

@@ -69,7 +69,7 @@
   }

   else perror("smpl");

 

-       if (ioctl(fd, SNDCTL_DSP_GETCAPS, &caps)==-1)

+       if (oss_pcm_ioctl(fd, SNDCTL_DSP_GETCAPS, &caps)==-1)

        {

                perror("/dev/dsp");

                fprintf(stderr, "Sorry but your sound driver is too old\n");

@@ -83,7 +83,7 @@
  * The application should also check for DSP_CAP_MMAP bit but this

  * version of driver doesn't have it yet.

  */

-/*     ioctl(fd, SNDCTL_DSP_SETSYNCRO, 0); */

+/*     oss_pcm_ioctl(fd, SNDCTL_DSP_SETSYNCRO, 0); */

 

 /*

  * You need version 3.5-beta7 or later of the sound driver before next

@@ -104,14 +104,14 @@
  * select call returns.

  */

 

-       ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &frag);

+       oss_pcm_ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &frag);

 

 /*

  * Compute total size of the buffer. It's important to use this value

  * in mmap() call.

  */

 

-       if (ioctl(fd, SNDCTL_DSP_GETOSPACE, &info)==-1)

+       if (oss_pcm_ioctl(fd, SNDCTL_DSP_GETOSPACE, &info)==-1)

        {

                perror("GETOSPACE");

                exit(-1);

@@ -172,7 +172,7 @@
  */

 

        tmp = 0;

-       ioctl(fd, SNDCTL_DSP_SETTRIGGER, &tmp);

+       oss_pcm_ioctl(fd, SNDCTL_DSP_SETTRIGGER, &tmp);

        printf("Trigger set to %08x\n", tmp);

 

 /*

@@ -180,7 +180,7 @@
  */

 

        tmp = PCM_ENABLE_OUTPUT;

-       ioctl(fd, SNDCTL_DSP_SETTRIGGER, &tmp);

+       oss_pcm_ioctl(fd, SNDCTL_DSP_SETTRIGGER, &tmp);

        printf("Trigger set to %08x\n", tmp);

 

 /*

@@ -220,7 +220,7 @@
  * the beginning of total buffer area).

  */

 

-               if (ioctl(fd, SNDCTL_DSP_GETOPTR, &count)==-1)

+               if (oss_pcm_ioctl(fd, SNDCTL_DSP_GETOPTR, &count)==-1)

                {

                        perror("GETOPTR");

                        exit(-1);

@@ -286,7 +286,7 @@
 
        printf( ">>>> open (2)\n" ); fflush( stdout );
 
-       if ((fd=open("/dev/dsp", O_RDWR, 0))==-1)

+       if ((fd=oss_pcm_open("/dev/dsp", O_RDWR, 0))==-1)

        {

                perror("/dev/dsp");

                exit(-1);




-------------------------------------------------------
SF.Net is sponsored by: Speed Start Your Linux Apps Now.
Build and deploy apps & Web services for Linux with
a free DVD software kit from IBM. Click Now!
http://ads.osdn.com/?ad_id=1356&alloc_id=3438&op=click
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to