bool RDHPIRecordStream::GetStream() { HW16 hpi_err; char hpi_text[100]; if((hpi_err= HPI_InStreamOpen(hpi_subsys,card_number,stream_number,&hpi_stream))!=0) { if(debug) { HPI_GetErrorText(hpi_err,hpi_text); fprintf(stderr,"*** HPI Error: %s ***\n",hpi_text); } return false; } return true; }
bool RDHPIRecordStream::formatSupported(RDWaveFile::Format format) { HPI_FORMAT hformat; HPI_HISTREAM histream; bool found=false; if(card_number<0) { return false; } if(format==RDWaveFile::Vorbis) { #ifdef HAVE_VORBIS return true; #endif // HAVE_VORBIS return false; } if(!is_open) { for(int i=0;i<sound_card->getCardInputStreams(card_number);i++) { if(HPI_InStreamOpen(hpi_subsys,card_number,i,&histream)==0) { found=true; break; } } if(!found) { return false; } } else { histream=hpi_stream; } switch(format) { case RDWaveFile::Pcm8: HPI_FormatCreate(&hformat,getChannels(),HPI_FORMAT_PCM8_UNSIGNED, getSamplesPerSec(),getHeadBitRate(),0); state=HPI_InStreamQueryFormat(hpi_subsys,histream,&hformat); break; case RDWaveFile::Pcm16: HPI_FormatCreate(&hformat,getChannels(),HPI_FORMAT_PCM16_SIGNED, getSamplesPerSec(),getHeadBitRate(),0); state=HPI_InStreamQueryFormat(hpi_subsys,histream,&hformat); break; case RDWaveFile::MpegL1: HPI_FormatCreate(&hformat,getChannels(),HPI_FORMAT_MPEG_L1, getSamplesPerSec(),getHeadBitRate(),0); state=HPI_InStreamQueryFormat(hpi_subsys,histream,&hformat); break; case RDWaveFile::MpegL2: HPI_FormatCreate(&hformat,getChannels(),HPI_FORMAT_MPEG_L2, getSamplesPerSec(),getHeadBitRate(),0); state=HPI_InStreamQueryFormat(hpi_subsys,histream,&hformat); break; case RDWaveFile::MpegL3: HPI_FormatCreate(&hformat,getChannels(),HPI_FORMAT_MPEG_L3, getSamplesPerSec(),getHeadBitRate(),0); state=HPI_InStreamQueryFormat(hpi_subsys,histream,&hformat); break; default: state=1; break; } if(!is_open) { HPI_InStreamClose(hpi_subsys,histream); } if(state!=0) { return false; } return true; }
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 }