const char *AsiHpiDevice::hpi_strerror(hpi_err_t err) const { static char err_text[200]; HPI_GetErrorText(err,err_text); return err_text; }
const char *HpiWidget::hpi_strerror(hpi_err_t err) const { static char err_text[200]; HPI_GetErrorText(err,err_text); return err_text; }
bool PlayStream::HPICall(uint16_t hpi_err) const { char text[1024]; if(hpi_err!=0) { HPI_GetErrorText(hpi_err,text); fprintf(stderr,"PlayStream::HPI Error: %s\n",text); } return hpi_err==0; }
hpi_err_t RDHPIPlayStream::LogHpi(hpi_err_t err) { char err_txt[200]; if(err!=0) { HPI_GetErrorText(err,err_txt); syslog(LOG_NOTICE,"HPI Error: %s",err_txt); } return err; }
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; }
void PlayStream::tickClock() { static int count=0; uint16_t hpi_err; char hpi_text[100]; int n; HPICall(HPI_OutStreamGetInfoEx(NULL,hpi_stream, &state,&buffer_size,&data_to_play, &samples_played,&reserved)); if(!stopping) { while((buffer_size-data_to_play)>=fragment_size) { n=readWave(pdata,fragment_size); if((n<=0)||(((uint32_t)n)<fragment_size)) { // End of file #if HPI_VER > 0x00030500 if((hpi_err=HPI_OutStreamWriteBuf(NULL,hpi_stream, pdata,n,&format))!=0) { HPI_GetErrorText(hpi_err,hpi_text); fprintf(stderr,"*** HPI Error: %s ***\n",hpi_text); } #else HPI_DataCreate(&hpi_data,&format,pdata,n); if((hpi_err=HPI_OutStreamWrite(NULL,hpi_stream, &hpi_data))!=0) { HPI_GetErrorText(hpi_err,hpi_text); fprintf(stderr,"*** HPI Error: %s ***\n",hpi_text); } #endif left_to_write=0; stopping=true; return; } left_to_write-=n; #if HPI_VER > 0x00030500 HPICall(HPI_OutStreamWriteBuf(NULL,hpi_stream,pdata,n,&format)); #else HPICall(HPI_DataCreate(&hpi_data,&format,pdata,n)); HPICall(HPI_OutStreamWrite(NULL,hpi_stream,&hpi_data)); #endif HPICall(HPI_OutStreamGetInfoEx(NULL,hpi_stream, &state,&buffer_size,&data_to_play, &samples_played,&reserved)); } } else { if(state==HPI_STATE_DRAINED) { HPICall(HPI_OutStreamStop(NULL,hpi_stream)); HPICall(HPI_OutStreamClose(NULL,hpi_stream)); HPICall(HPI_AdapterClose(NULL,card_number)); clock->stop(); playing=false; seekWave(0,SEEK_SET); HPICall(HPI_OutStreamReset(NULL,hpi_stream)); samples_pending=0; samples_skipped=0; stream_state=PlayStream::Stopped; emit position(0); emit isStopped(true); emit stopped(); emit stateChanged(card_number,stream_number,(int)stream_state); return; } } if(count++==2) { count=0; emit position(samples_played+samples_skipped); } }
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; }