Problems getting OSS to work - The code

    The code which doesn't work looks something like this:

    // Routines to handle the sound for Vic, the Bug
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    int slots[100];
    
    unsigned int toInteger(char *in){
      unsigned int ret;
      int i;
      char *p = ((char *) &ret);
    
      for(i = 0; i < 4; i++){
        *p++ = in[i];
      }
    
      return ret;
    } 
    
    char *getBytes(int input, size_t number, char *expect){
      char *data;
      int i;
      ssize_t numRead;
    
      if((data = malloc(number + 1)) == NULL){
        fprintf(stderr, "Malloc error\n");
        exit(0);
      }
    
      if((numRead = read(input, data, number)) < 1){
        fprintf(stderr, "Malformed wav file (EOF)\n");
        exit(0);
      }
      data[numRead] = 0;
    
      fprintf(stdout, "[%d] ", numRead);
      fflush(stdout);
    
      if(expect != NULL){
        for(i = 0; i < numRead; i++)
          data[i] = tolower(data[i]);
    
        if(strcmp(expect, data) != 0){
          fprintf(stderr, "Read \"");
          for(i = 0; i < numRead; i++)
    	fprintf(stderr, "%c", (isprint(data[i])) ? data[i] : '%');
          fprintf(stderr, "\", expected \"%s\"\n", expect);
        }
      }
    
      return data;
    }
    
    void playSound(int slotNumber, char *filename){
      slots[slotNumber] = 0;
    
      switch(fork()){
      case -1:
        // Parent with failure
        fprintf(stderr, "Sound play fork error\n");
        return;
        break;
    
      case 0:
        // Child
        {
          int soundHandle = -1, fileHandle = -1;
          int channels = 1; // stereo
          int format;
          unsigned int rate = 22050;
          unsigned int fmtLen;
          int bytes = 0;
          long i;
          char *data;
          char *tempPtr;
          ssize_t numRead;
    
          if((fileHandle = open(filename, O_RDONLY)) == -1){
    	fprintf(stderr, "Could not open the specified wav file: %s\n",
    		filename);
    	exit(0);
          }
    
          // Check the format of the wav file
          free(getBytes(fileHandle, 4, "riff"));
          free(getBytes(fileHandle, 4, NULL)); // Length of package
          free(getBytes(fileHandle, 4, "wave"));
          free(getBytes(fileHandle, 4, "fmt "));
    
          tempPtr = getBytes(fileHandle, 4, NULL);
          fmtLen = toInteger(tempPtr);
          free(tempPtr);
    
          free(getBytes(fileHandle, 2, NULL)); // Reserved
    
          tempPtr = getBytes(fileHandle, 2, NULL);
          channels = tempPtr[0] - 1;
          free(tempPtr);
    
          tempPtr = getBytes(fileHandle, 4, NULL);
          rate = toInteger(tempPtr);
          free(tempPtr);
    
          free(getBytes(fileHandle, 4, NULL)); // Bytes per second
    
          tempPtr = getBytes(fileHandle, 2, NULL);
          bytes = tempPtr[0];
          free(tempPtr);
    
          free(getBytes(fileHandle, 2, NULL)); // Bits per sample
          free(getBytes(fileHandle, 4, "data"));
          free(getBytes(fileHandle, 3, NULL)); // Length of data
    
          // Open the sound interface
          if((soundHandle = open("/dev/dsp", O_WRONLY)) == -1){
    	fprintf(stderr, "Couldn't open the sound device\n");
    	exit(0);
          }
    
          if(ioctl(soundHandle, SNDCTL_DSP_STEREO, &channels) == -1){
    	fprintf(stderr, "Could not set stereo\n");
    	exit(0);
          }
    
          switch(bytes){
          case 1:
    	format = AFMT_U8;
    	break;
    
          case 2:
    	if(channels == 0)
    	  format = AFMT_S16_LE;
    	else
    	  format = AFMT_U8;
    	break;
    
          case 4:
    	fprintf(stdout, "Stereo wav file\n");
    	format = AFMT_S16_LE;
    	break;
    
          default:
    	fprintf(stderr, "Unknown byte rate for sound\n");
    	exit(0);
          }
    
          if(ioctl(soundHandle, SNDCTL_DSP_SETFMT, &format) == -1){
    	fprintf(stderr, "Could not set format\n");
    	exit(0);
          }
    
          if(ioctl(soundHandle, SNDCTL_DSP_SPEED, &rate) == -1){
    	fprintf(stderr, "Could not set rate\n");
    	exit(0);
          }
    
          fprintf(stdout,
    	      "Playing file %s: channels = %d, rate = %d, bytes = %d\n",
    	      filename, channels, rate, bytes);
    
          while(1){
    	if((numRead = read(fileHandle, data, 1024)) == 0)
    	  break;
    
    	fprintf(stdout, "[%d] ", numRead);
    	fflush(stdout);
    
    	if(write(soundHandle, data, numRead) == -1){
    	  fprintf(stderr, "Error writing to the sound device\n");
    	  exit(0);
    	}
    	
    	if(ioctl(soundHandle, SNDCTL_DSP_SYNC) == -1){
    	  fprintf(stderr, "Could not sync sound data\n");
    	  exit(0);
    	}
    	//	free(data);
          }
    
          // Get here when done?
          close(fileHandle);
          close(soundHandle);
          free(data);
          exit(0);
        }
        break;
       
      default:
        return;
        break;
      }
    }
    


posted at: 04:00 | path: /problemcode | permanent link to this entry



    Add a comment to this post:

    Your name:

    Your email: Email me new comments on this post
      (Your email will not be published on this site, and will only be used to contact you directly with a reply to your comment if needed. Oh, and we'll use it to send you new comments on this post it you selected that checkbox.)


    Your website:

    Comments:


    Because of excessive load, this site is generated statically every several hours. Therefore, your comment may take some time to appear here. Unless you get an error message when you click the select button below, then all is normal and the comment will appear in due course. If you want you can checkout all recently approved comments while your waiting.