Exemplo n.º 1
0
void RDHPIRecordStream::tickClock()
{
  HPI_InStreamGetInfoEx(hpi_subsys,hpi_stream,
			&state,&buffer_size,&data_recorded,
			&samples_recorded,&reserved);
  if((!record_started)&&(is_recording)) {
    if(samples_recorded>0) {
      if(record_length>0) {
        length_timer->start(record_length,true);
      }
      emit recordStart();
      emit stateChanged(card_number,stream_number,4);  // RecordStarted
      if(debug) {
	printf("RDHPIRecordStream: emitted recordStart()\n");
	printf("RDHPIRecordStream: emitted stateChanged(%d,%d,RDHPIRecordStream::RecordStarted)\n",card_number,stream_number);
      }
      record_started=true;
    }
  }
  while(data_recorded>fragment_size) {
#if HPI_VER > 0x00030500
    HPI_InStreamReadBuf(hpi_subsys,hpi_stream,pdata,fragment_size);
#else
    HPI_InStreamRead(hpi_subsys,hpi_stream,&hpi_data);
#endif
    if(is_recording) {
      writeWave(pdata,fragment_size);
    }
    HPI_InStreamGetInfoEx(hpi_subsys,hpi_stream,
			  &state,&buffer_size,&data_recorded,
			  &samples_recorded,&reserved);
  }
  if(state==HPI_STATE_STOPPED) {
#if HPI_VER > 0x00030500
    HPI_InStreamReadBuf(hpi_subsys,hpi_stream,pdata,data_recorded);
#else
    HPI_DataCreate(&hpi_data,&format,pdata,data_recorded);
    HPI_InStreamRead(hpi_subsys,hpi_stream,&hpi_data);
#endif
    if(is_recording) {
      writeWave(pdata,data_recorded);
    }
  }
  emit position(samples_recorded);
  if(debug) {
    printf("RDHPIRecordStream: emitted position(%u)\n",
	   (unsigned)samples_recorded);
  }
}
Exemplo n.º 2
0
void AsiHpiDevice::readData()
{
#ifdef ASIHPI
    uint16_t state=0;
    uint32_t buffer_size=0;
    uint32_t data_recorded=0;
    uint32_t samples_recorded=0;
    uint32_t aux_data_recorded=0;

    HpiLog(HPI_InStreamGetInfoEx(NULL,asihpi_input_stream,&state,&buffer_size,
                                 &data_recorded,&samples_recorded,
                                 &aux_data_recorded));
    if(state==HPI_STATE_RECORDING) {
        if(HpiLog(HPI_InStreamReadBuf(NULL,asihpi_input_stream,asihpi_pcm_buffer,
                                      data_recorded))==0) {
            for(unsigned i=0; i<ringBufferQuantity(); i++) {
                ringBuffer(i)->write((float *)asihpi_pcm_buffer,
                                     data_recorded/(sizeof(float)*channels()));
            }
        }
    }
    else {
        Log(LOG_WARNING,"not in recording state"+
            QString().sprintf(" [state: %u]",state));
    }


#endif  // ASIHPI
}
Exemplo n.º 3
0
void RDHPIRecordStream::pause()
{
  if(debug) {
    printf("RDHPIRecordStream: received pause()\n");
  }
  if(!is_recording) {
    return;
  }
  HPI_InStreamStop(hpi_subsys,hpi_stream);
  tickClock();
  HPI_InStreamGetInfoEx(hpi_subsys,hpi_stream,
			&state,&buffer_size,&data_recorded,
			&samples_recorded,&reserved);
  is_recording=false;
  is_paused=true;
  HPI_InStreamStart(hpi_subsys,hpi_stream);
  emit paused();
  emit stateChanged(card_number,stream_number,2);  // Paused
  if(debug) {
    printf("RDHPIRecordStream: emitted paused()\n");
    printf("RDHPIRecordStream: emitted stateChanged(%d,%d,RDHPIRecordStream::Paused)\n",card_number,stream_number);
  }
}
Exemplo n.º 4
0
bool RDHPIRecordStream::recordReady()
{
  HW16 hpi_error=0;
  char hpi_text[200];

  if(debug) {
    printf("RDHPIRecordStream: received recordReady()\n");
  }
  if(!is_open) {
    return false;
  }
  if((!is_recording)&&(!is_paused)) {
    resetWave();
    if(HPI_InStreamGetInfoEx(hpi_subsys,hpi_stream,
			     &state,&buffer_size,&data_recorded,
			     &samples_recorded,&reserved)!=0) {
      if(debug) {
	printf("RDHPIRecordStream: HPI_InStreamGetInfoEx() failed\n");
      }
      return false;
    }
    fragment_size=buffer_size/4;
    if(fragment_size>192000) {  // ALSA Compatibility Limitation
      fragment_size=192000;
    }
    fragment_time=(1000*fragment_size)/(getAvgBytesPerSec());
    if(pdata!=NULL) {
      delete pdata;
    }
    pdata=(HW8 *)malloc(fragment_size);
    if(pdata==NULL) {
      if(debug) {
	printf("RDHPIRecordStream: couldn't allocate buffer\n");
      }
      return false;
    }
    switch(getFormatTag()) {
	case WAVE_FORMAT_PCM:
	  if(debug) {
	    printf("RDHPIRecordStream: using PCM%d format\n",
		   getBitsPerSample());
	  }
	  switch(getBitsPerSample()) {
	      case 8:
		HPI_FormatCreate(&format,getChannels(),
				 HPI_FORMAT_PCM8_UNSIGNED,getSamplesPerSec(),
				 0,0);
		break;
	      case 16:
		HPI_FormatCreate(&format,getChannels(),
				 HPI_FORMAT_PCM16_SIGNED,getSamplesPerSec(),
				 0,0);
		break;
	      case 32:
		HPI_FormatCreate(&format,getChannels(),
				 HPI_FORMAT_PCM32_SIGNED,getSamplesPerSec(),
				 0,0);
		break;
	      default:
		if(debug) {
		  printf("RDHPIRecordStream: unsupported sample size\n");
		}
		return false;
	  }
	  break;

	case WAVE_FORMAT_MPEG:
	  if(debug) {
	    printf("RDHPIRecordStream: using MPEG-1 Layer %d\n",getHeadLayer());
	  }
	  switch(getHeadLayer()) {
	      case 1:
		HPI_FormatCreate(&format,getChannels(),
				 HPI_FORMAT_MPEG_L1,getSamplesPerSec(),
				 getHeadBitRate(),getHeadFlags());
		break;
	      case 2:
		HPI_FormatCreate(&format,getChannels(),
				 HPI_FORMAT_MPEG_L2,getSamplesPerSec(),
				 getHeadBitRate(),getHeadFlags());
		break;
	      case 3:
		HPI_FormatCreate(&format,getChannels(),
				 HPI_FORMAT_MPEG_L3,getSamplesPerSec(),
				 getHeadBitRate(),getHeadFlags());
		break;
	      default:
		HPI_AdapterClose(hpi_subsys,card_number);
		if(debug) {
		  printf("RDHPIRecordStream: invalid MPEG-1 layer\n");
		}
		return false;
	  }
	  if(getMextChunk()) {
	    setMextHomogenous(true);
	    setMextPaddingUsed(false);
	    setMextHackedBitRate(true);
	    setMextFreeFormat(false);
	    setMextFrameSize(144*getHeadBitRate()/getSamplesPerSec());
	    setMextAncillaryLength(5);
	    setMextLeftEnergyPresent(true);
	    if(getChannels()>1) {
	      setMextRightEnergyPresent(true);
	    }
	    else {
	      setMextRightEnergyPresent(false);
	    }
	    setMextPrivateDataPresent(false);
	  }
	  break;

	case WAVE_FORMAT_VORBIS:
	  if(debug) {
	    printf("RDHPIRecordStream: using OggVorbis\n");
	  }
	  HPI_FormatCreate(&format,getChannels(),
			   HPI_FORMAT_PCM16_SIGNED,getSamplesPerSec(),
			   0,0);
	  break;

	default:
	  if(debug) {
	    printf("RDHPIRecordStream: invalid format tag\n");
	  }
	  return false;
	  break;
    }
    if((hpi_error=HPI_InStreamQueryFormat(hpi_subsys,hpi_stream,
			       &format))!=0) {
      if(debug) {
	HPI_GetErrorText(hpi_error,hpi_text);
	printf("Num: %d\n",hpi_error);
	printf("RDHPIRecordStream: %s\n",hpi_text);
      }
      return false;
    }
  }
#if HPI_VER < 0x00030500
  HPI_DataCreate(&hpi_data,&format,pdata,fragment_size);
#endif
  HPI_InStreamSetFormat(hpi_subsys,hpi_stream,&format);
  HPI_InStreamStart(hpi_subsys,hpi_stream);
//  clock->start(2*fragment_time/3);
  clock->start(100);
  is_ready=true;
  is_recording=false;
  is_paused=false;
  stopping=false;
  emit isStopped(false);
  emit ready();
  emit stateChanged(card_number,stream_number,1);  // RecordReady
  if(debug) {
    printf("RDHPIRecordStream: emitted isStopped(false)\n");
    printf("RDHPIRecordStream: emitted ready()\n");
    printf("RDHPIRecordStream: emitted stateChanged(%d,%d,RDHPIRecordStream::RecordReady)\n",card_number,stream_number);
  }

  return true;
}
Exemplo n.º 5
0
bool AsiHpiDevice::start(QString *err)
{
#ifdef ASIHPI
    hpi_err_t herr;
    struct hpi_format fmt;
    uint16_t state=0;
    uint32_t buffer_size=0;
    uint32_t data_recorded=0;
    uint32_t samples_recorded=0;
    uint32_t aux_data_recorded=0;

    hpi_handle_t handle;
    short lvls[HPI_MAX_CHANNELS];

    //
    // Open Mixer
    //
    if(HpiLog(HPI_MixerOpen(NULL,asihpi_adapter_index,&asihpi_mixer))==0) {

        //
        // Input Gain
        //
        if(HPI_MixerGetControl(NULL,asihpi_mixer,
                               HPI_SOURCENODE_LINEIN,asihpi_input_index,
                               HPI_DESTNODE_NONE,0,HPI_CONTROL_VOLUME,
                               &handle)==0) {
            for(unsigned i=0; i<HPI_MAX_CHANNELS; i++) {
                lvls[i]=asihpi_input_gain*100;
            }
            HpiLog(HPI_VolumeSetGain(NULL,handle,lvls));
        }

        //
        // Input Source
        //
        if(HpiLog(HPI_MixerGetControl(NULL,asihpi_mixer,0,0,
                                      HPI_DESTNODE_ISTREAM,asihpi_input_index,
                                      HPI_CONTROL_MULTIPLEXER,&handle))==0) {
            HpiLog(HPI_Multiplexer_SetSource(NULL,handle,asihpi_input_source,
                                             asihpi_input_index));
        }

        //
        // Input Type
        //
        if((HpiLog(HPI_MixerGetControl(NULL,asihpi_mixer,
                                       HPI_SOURCENODE_LINEIN,asihpi_input_index,
                                       HPI_DESTNODE_NONE,0,
                                       HPI_CONTROL_MULTIPLEXER,&handle)))==0) {
            HpiLog(HPI_Multiplexer_SetSource(NULL,handle,asihpi_input_type,
                                             asihpi_input_index));
        }

        //
        // Channel Mode
        //
        if((HpiLog(HPI_MixerGetControl(NULL,asihpi_mixer,0,0,
                                       HPI_DESTNODE_ISTREAM,asihpi_input_index,
                                       HPI_CONTROL_CHANNEL_MODE,
                                       &handle)))==0) {
            HpiLog(HPI_ChannelModeSet(NULL,handle,asihpi_channel_mode));
        }

        //
        // Input Meter
        //
        if((HpiLog(HPI_MixerGetControl(NULL,asihpi_mixer,0,0,HPI_DESTNODE_ISTREAM,
                                       asihpi_input_index,HPI_CONTROL_METER,&asihpi_input_meter)))==0) {
            asihpi_meter_timer->start(100);
        }
    }

    //
    // Open Input Stream
    //
    if((herr=HPI_InStreamOpen(NULL,asihpi_adapter_index,asihpi_input_index,&asihpi_input_stream))!=0) {
        *err=tr("HPI error")+": "+hpi_strerror(herr);
        return false;
    }

    //
    // Find Supported Format
    //
    MakeFormat(&fmt,HPI_FORMAT_PCM32_FLOAT);
    if((herr=HPI_InStreamQueryFormat(NULL,asihpi_input_stream,&fmt))!=0) {
        *err=tr("HPI error")+": "+hpi_strerror(herr);
        return false;
    }

    //
    // Set Format
    //
    if((herr=HPI_InStreamSetFormat(NULL,asihpi_input_stream,&fmt))!=0) {
        *err=tr("HPI error")+": "+hpi_strerror(herr);
        return false;
    }

    //
    // Start input stream
    //
    if((herr=HPI_InStreamStart(NULL,asihpi_input_stream))!=0) {
        *err=tr("HPI error")+": "+hpi_strerror(herr);
        return false;
    }

    //
    // Create PCM buffer
    //
    if((herr=HPI_InStreamGetInfoEx(NULL,asihpi_input_stream,&state,&buffer_size,
                                   &data_recorded,&samples_recorded,
                                   &aux_data_recorded))!=0) {
        *err=tr("HPI error")+": "+hpi_strerror(herr);
        return false;
    }
    asihpi_pcm_buffer=new uint8_t[buffer_size];

    asihpi_read_timer->start(ASIHPI_READ_INTERVAL);

    return true;
#else
    return false;
#endif  // ASIHPI
}