Beispiel #1
0
static PyObject *Snd_SPBSetDeviceInfo(PyObject *_self, PyObject *_args)
{
	PyObject *_res = NULL;
	OSErr _err;
	long inRefNum;
	OSType infoType;
	void * infoData;
	if (!PyArg_ParseTuple(_args, "lO&w",
	                      &inRefNum,
	                      PyMac_GetOSType, &infoType,
	                      &infoData))
		return NULL;
	_err = SPBSetDeviceInfo(inRefNum,
	                        infoType,
	                        infoData);
	if (_err != noErr) return PyMac_Error(_err);
	Py_INCREF(Py_None);
	_res = Py_None;
	return _res;
}
Beispiel #2
0
int audio_open(snd_node *n, long *f)
{
  buffer_state *data = (buffer_state *)malloc(sizeof(buffer_state));
  n->u.audio.descriptor = (void *)data;
  OSErr	err;
  Fixed sampleRateFixed;

  data->frameSize = snd_bytes_per_frame(n);

  data->bufferSize = (int) (n->format.srate * (double)data->frameSize);
  if (n->u.audio.latency > 0.0)
    data->bufferSize = (int)(n->format.srate * n->u.audio.latency) * data->frameSize;

  /* Calculate sample rate as an unsigned fixed-point number */
  if (n->format.srate > 65535.0 ||
    n->format.srate < 1.0)
    sampleRateFixed = 0xAC440000; /* Fixed for 44100 */
  else {
    unsigned short numerator = (unsigned short)n->format.srate;
    unsigned short denominator = (unsigned short)(65536.0*(n->format.srate - numerator));
    sampleRateFixed = (numerator << 16) | denominator;
  }

  /* Open device for recording or playback, depending on mode selected */

  if (n->write_flag == SND_READ) {
    /* recording */
    short gainControl = 0; /* off */
    short numChannels = n->format.channels;
    short continuousRecording = 1; /* on */
    short playthroughVolume = 0; /* off */
    OSType quality = 'cd  ';
    short sampleSize = 16;
    short twos = 0; /* i.e. signed */
    OSType compression = 'NONE';
    SoundInfoList infoList;
    int len, i, x, y, z;
    short selected = 0;
    char *device;
    char *input;
    char **buffer;
    char oneInput[256];
    char *deviceData;
  
    data->recording = 1;
    
    len = strlen(n->u.audio.devicename);
    device = new char[len+1];
    input = new char[len+1];
    
    strcpy(device, n->u.audio.devicename);
    input[0] = 0;
    for(i=0; i<len; i++) {
       if (device[i] == '\n') {
          device[i] = 0;
          strcpy(input, &device[i+1]);
          i = len;
       }
    }
    
    err = SPBOpenDevice(c2pstr(device), siWritePermission, &data->refnum);
    if (err)
      return !SND_SUCCESS;
    
    SPBGetDeviceInfo (data->refnum, siInputAvailable, &infoList);

    SPBGetDeviceInfo (data->refnum, siInputSourceNames, &buffer);
    deviceData = buffer[0] + 2;
   
    for(int x=0; x<infoList.count; x++) {
      int y = *deviceData++;
      z = 0;
      while(y) {
        oneInput[z++] = *deviceData++;
        y--;
      }
      oneInput[z] = 0;
      if (!strcmp(oneInput, input))
        selected = x;
    }
    
    selected++;
    SPBSetDeviceInfo (data->refnum, siInputSource, &selected);
    
    SPBSetDeviceInfo(data->refnum, 'qual', &quality);

    SPBSetDeviceInfo(data->refnum, 'agc ', &gainControl);
    
    SPBSetDeviceInfo(data->refnum, 'srat', &sampleRateFixed);

    SPBSetDeviceInfo(data->refnum, 'plth', &playthroughVolume);
    
    err = SPBSetDeviceInfo(data->refnum, 'ssiz', &sampleSize);
    if (err)
      return !SND_SUCCESS;

    err = SPBSetDeviceInfo(data->refnum, 'chan', &numChannels);
    if (err)
      return !SND_SUCCESS;
  
    err = SPBSetDeviceInfo(data->refnum, 'cont', &continuousRecording);
    if (err)
      return !SND_SUCCESS;
  
    err = SPBSetDeviceInfo(data->refnum, 'twos', &twos);
    if (err)
      return !SND_SUCCESS;

    err = SPBSetDeviceInfo(data->refnum, 'comp', &compression);
    if (err)
      return !SND_SUCCESS;
      
    data->recBuffer = (char *)malloc(data->bufferSize);
    data->recqStart = 0;
    data->recqEnd = 0;
    data->starved = 0;
    
    data->params.inRefNum = data->refnum;
    data->params.count = 0; /* data->bufferSize; /* bytes to record */
    data->params.milliseconds = 0; /* param will be ignored; use count */
    data->params.bufferLength = 0; /* ignore buffer */
    data->params.bufferPtr = NULL; /* ignore buffer */
    data->params.completionRoutine = NULL;
    data->params.userLong = (long)data;
    data->params.unused1 = 0;
    data->params.interruptRoutine = NewSIInterruptUPP(recordingCallback);

    err = SPBRecord(&data->params, true);
    if (err)
      return !SND_SUCCESS;
    
  }
  else {
    /* playback */

    data->recording = 0;
    data->chan = NULL;
    
    
    
    
    
    ////////////////////////
    
    
    err = SndNewChannel(&data->chan, sampledSynth, 0, NULL);
  	
    if (err)
      return !SND_SUCCESS;
  	  
    data->buffer = (char *)malloc(data->bufferSize);
    
    data->nextBufferSize = data->bufferSize * 3;
    data->nextBuffer = (char *)malloc(data->nextBufferSize);   

    if (!data->buffer || !data->nextBuffer)
      return !SND_SUCCESS;
    
    data->chan->callBack = NewSndCallBackUPP(playbackCallback);
    
    data->header.samplePtr = data->buffer;
    data->header.numChannels = n->format.channels;
    data->header.sampleRate = sampleRateFixed;
    data->header.loopStart = 0;
    data->header.loopEnd = 0;
    data->header.encode = cmpSH;
    data->header.baseFrequency = kMiddleC;
    // data->header.AIFFSampleRate = 0;  -- this parameter is unused
    data->header.markerChunk = NULL;
    data->header.format = kSoundNotCompressed;
    data->header.futureUse2 = NULL;
    data->header.stateVars = NULL;
    data->header.leftOverSamples = NULL;
    data->header.compressionID = 0;
    data->header.packetSize = 0;
    data->header.snthID = 0;
    data->header.sampleSize = 16;
    data->header.sampleArea[0] = 0;
    
    data->playCmd.cmd = bufferCmd;
    data->playCmd.param1 = 0; //unused
    data->playCmd.param2 = (long)&data->header;
    
    data->callCmd.cmd = callBackCmd;
    data->callCmd.param1 = 0;
    data->callCmd.param2 = (long)data;
    
    data->curBuffer = 0;
    data->curSize = 0;
    data->firstTime = 1;
    data->finished = 0;
    data->busy = 0;
    data->flushing = 0;
  }
  
  return SND_SUCCESS;
}
Beispiel #3
0
/*************************************************************************
**	TestSettingDeviceInfo()
**  Query information about a named input device.
*/
static int TestSettingDeviceInfo( const unsigned char *deviceName )
{
	OSErr err;
	long  mRefNum = 0;
	long  tempL;
	short tempS;
	Fixed tempF;
	
	err = SPBOpenDevice( deviceName, siWritePermission, &mRefNum);
	if (err)
	{
		PRINT(("Cound not open device!\n"));
		return -1;
	}
	
/* Define macros for printing out device info. */
#define PrintDeviceInfo(selector,var) \
	err = SPBGetDeviceInfo(mRefNum, selector, (Ptr) &var); \
	if (err) { \
		PRINT(("query %s failed\n", #selector )); \
	}\
	else { \
		PRINT(("query %s = 0x%x\n", #selector, var )); \
	}
	
	PrintDeviceInfo( siContinuous, tempS );
	PrintDeviceInfo( siAsync, tempS );
	PrintDeviceInfo( siNumberChannels, tempS );
	PrintDeviceInfo( siSampleSize, tempS );
	PrintDeviceInfo( siSampleRate, tempF );
	PrintDeviceInfo( siChannelAvailable, tempS );
	PrintDeviceInfo( siActiveChannels, tempL );
	PrintDeviceInfo( siDeviceBufferInfo, tempL );
#if USE_POINTER
/* Continuous Mode ---------- */
	PRINT(("Attempt to set siContinuous to 1 using pointer method.\n"));
	tempS = 1;
	err = SPBSetDeviceInfo(mRefNum, siContinuous, (Ptr) &tempS);
	if (err) PRINT(("setting siContinuous using pointer failed\n"));
	PrintDeviceInfo( siContinuous, tempS );
	PRINT(("Attempt to set siContinuous to 0 using pointer method.\n"));
	tempS = 1;
	err = SPBSetDeviceInfo(mRefNum, siContinuous, (Ptr) &tempS);
	if (err) PRINT(("setting siContinuous using pointer failed\n"));
	PrintDeviceInfo( siContinuous, tempS );
#else	
	PRINT(("Attempt to set siContinuous to 1 using direct method.\n"));
	err = SPBSetDeviceInfo(mRefNum, siContinuous, (Ptr) 1);
	if (err) PRINT(("setting siContinuous using direct failed\n"));
	PrintDeviceInfo( siContinuous, tempS );
	
	PRINT(("Attempt to set siContinuous to 0 using direct method.\n"));
	err = SPBSetDeviceInfo(mRefNum, siContinuous, (Ptr) 0);
	if (err) PRINT(("setting siContinuous using direct failed\n"));
	PrintDeviceInfo( siContinuous, tempS );
#endif
/* Sample rate ----------- */
#if USE_POINTER
	PRINT(("Attempt to set siSampleRate to 44100 using pointer method.\n"));
	tempF = ((unsigned long)44100) << 16;
	err = SPBSetDeviceInfo(mRefNum, siSampleRate, (Ptr) &tempF);
	if (err) PRINT(("setting siSampleRate using pointer failed\n"));
	tempF = 0;
	PrintDeviceInfo( siSampleRate, tempF );
	
	PRINT(("Attempt to set siSampleRate to 22050 using pointer method.\n"));
	tempF = ((unsigned long)22050) << 16;
	err = SPBSetDeviceInfo(mRefNum, siSampleRate, (Ptr) &tempF);
	if (err) PRINT(("setting siSampleRate using pointer failed\n"));
	tempF = 0;
	PrintDeviceInfo( siSampleRate, tempF );
#else
	PRINT(("Attempt to set siSampleRate to 44100 using direct method.\n"));
	err = SPBSetDeviceInfo(mRefNum, siSampleRate, (Ptr) (((unsigned long)44100) << 16));
	if (err) PRINT(("setting siSampleRate using direct failed\n"));
	PrintDeviceInfo( siSampleRate, tempF );
	
	PRINT(("Attempt to set siSampleRate to 22050 using direct method.\n"));
	err = SPBSetDeviceInfo(mRefNum, siSampleRate, (Ptr)  (((unsigned long)44100) << 16));
	if (err) PRINT(("setting siSampleRate using direct failed\n"));
	PrintDeviceInfo( siSampleRate, tempF );
#endif
/* All done so close up device. */
	if( mRefNum )  SPBCloseDevice(mRefNum);
	return 0;
	
error:
	if( mRefNum )  SPBCloseDevice(mRefNum);
	return -1;
}