-rw-r--r-- | noncore/multimedia/opierec/qtrec.cpp | 78 |
1 files changed, 39 insertions, 39 deletions
diff --git a/noncore/multimedia/opierec/qtrec.cpp b/noncore/multimedia/opierec/qtrec.cpp index 8a0f8db..28f6546 100644 --- a/noncore/multimedia/opierec/qtrec.cpp +++ b/noncore/multimedia/opierec/qtrec.cpp @@ -173,65 +173,65 @@ void quickRec() { for(;;) { if (stopped) { qDebug("quickRec:: stopped"); break; // stop if playing was set to false // return; } number=::read( filePara.sd, sbuf, BUFSIZE); if(number <= 0) { perror("recording error "); qDebug( "%s %d", filePara.fileName, number); // errorStop(); recording=stopped=false; // QMessageBox::message("Note", // "Error recording to file\n%s", // filePara.fileName); return; } //if(stereo == 2) { // adpcm_coder( sbuf2, abuf, number/2, &encoder_state); adpcm_coder( sbuf, abuf, number/2, &encoder_state); bytesWritten = ::write( filePara.fd , abuf, number/4); long peak; for (int i = 0; i < number; i++) { //since Z is mono do normally peak = findPeak((long)sbuf[i]); printf("peak %ld\r",peak); fflush(stdout); } - + //------------->>>> out to file // if(filePara.channels==1) // total += bytesWritten/2; //mono // else total += bytesWritten; filePara.numberSamples = total; // if( total >= filePara.samplesToRecord) // timeSlider->setValue(0); // else if( filePara.SecondsToRecord !=0) timeSlider->setValue( total); filePara.numberOfRecordedSeconds = (float)total / (float)filePara.sampleRate * (float)2; // printf("Writing number %d, bytes %d,total %d, sample rate %d, secs %.2f \n", // number, // bytesWritten , // total, // filePara.sampleRate, // filePara.numberOfRecordedSeconds); // fflush(stdout); ioctl( filePara.sd, SNDCTL_DSP_GETIPTR, &info); // qDebug("%d, %d", info.bytes, (info.bytes / filePara.sampleRate) / 2); timeString.sprintf("%.2f", filePara.numberOfRecordedSeconds); timeLabel->setText( timeString + " seconds"); qApp->processEvents(); if( total >= filePara.samplesToRecord) break; } } else { @@ -251,75 +251,75 @@ void quickRec() { if(number <= 0) { perror("recording error "); qDebug( filePara.fileName); recording=stopped=false; // errorStop(); // QMessageBox::message("Note","error recording to file\n%s",filePara.fileName); return;// false; } /* for (int i=0;i< number;i++) { //2*i is left channel outbuffer[i]=inbuffer[i]>>1; // no clippy, please }*/ bytesWritten = ::write( filePara.fd , inbuffer, number); //------------->>>> out to file if(bytesWritten < 0) { // errorStop(); perror("File writing error "); return;// false; } // if(filePara.channels==1) // total += bytesWritten/2; //mono // else total += bytesWritten; long peak; for (int i = 0; i < number; i++) { //since Z is mono do normally peak = findPeak((long)inbuffer[i]); printf("peak %ld\r",peak); fflush(stdout); } - + filePara.numberSamples = total; if(filePara.SecondsToRecord !=0) timeSlider->setValue( total); // printf("Writing number %d, bytes %d,total %d\r",number, bytesWritten , total); // fflush(stdout); ioctl( filePara.sd, SNDCTL_DSP_GETIPTR, &info); // qDebug("%d, %d", info.bytes, ( info.bytes / filePara.sampleRate) / 2); - + filePara.numberOfRecordedSeconds = (float)total / (float)filePara.sampleRate / (float)2; timeString.sprintf("%.2f", filePara.numberOfRecordedSeconds); timeLabel->setText( timeString + " seconds"); qApp->processEvents(); if( total >= filePara.samplesToRecord) break; } } //end main loop } else { // <<<<<<<<<<<<<<<<<<<<<<< format = AFMT_U8; unsigned char unsigned_inbuffer[BUFSIZE], unsigned_outbuffer[BUFSIZE]; memset( unsigned_inbuffer, 0, BUFSIZE); memset( unsigned_outbuffer, 0, BUFSIZE); for(;;) { if (stopped) { qDebug("quickRec:: stopped"); break; // stop if playing was set to false } number=::read( filePara.sd, unsigned_inbuffer, BUFSIZE); //-------------<<<< in from device // val = (data ^ 0x80) << 8; //unsigned_outbuffer = (unsigned_inbuffer ^ 0x80) << 8; // if(number <= 0) { // perror("recording error "); // qDebug(filePara.fileName); // // errorStop(); // QMessageBox::message("Note","error recording"); @@ -529,65 +529,65 @@ void QtRec::init() { QPEApplication::setStylusOperation( ListView1->viewport(),QPEApplication::RightOnHold); TabWidget->insertTab( tab, tr( "Files" ) ); ///**********<<<<<<<<<<<<>>>>>>>>>>>>*************** tab_3 = new QWidget( TabWidget, "tab_3" ); //////////////////////////////////// Layout19 = new QHBoxLayout( tab_3); Layout19->setSpacing( 2 ); Layout19->setMargin( 0 ); Layout18 = new QVBoxLayout(this); Layout18->setSpacing( 2 ); Layout18->setMargin( 0 ); Layout17 = new QHBoxLayout(this); Layout17->setSpacing( 2 ); Layout17->setMargin( 0 ); sampleGroup = new QGroupBox( tab_3, "samplegroup" ); sampleGroup->setTitle( tr( "Sample Rate" ) ); sampleGroup->setFixedSize( 95,50); sampleRateComboBox = new QComboBox( false, sampleGroup, "SampleRateComboBox" ); sampleRateComboBox->setGeometry( QRect( 10, 20, 80, 25 ) ); //#ifndef QT_QWS_EBX sampleRateComboBox->insertItem( tr( "44100")); sampleRateComboBox->insertItem( tr( "32000")); //#endif sampleRateComboBox->insertItem( tr( "22050")); //#ifndef QT_QWS_VERCEL_IDR - sampleRateComboBox->insertItem( tr( "16000")); + sampleRateComboBox->insertItem( tr( "16000")); sampleRateComboBox->insertItem( tr( "11025")); sampleRateComboBox->insertItem( tr( "8000")); //#endif Layout17->addWidget( sampleGroup ); sizeGroup= new QGroupBox( tab_3, "sizeGroup" ); sizeGroup->setTitle( tr( "Limit Size" ) ); sizeGroup->setFixedSize(80,50); sizeLimitCombo = new QComboBox( false, sizeGroup, "sizeLimitCombo" ); sizeLimitCombo ->setGeometry( QRect( 5, 20, 70, 25 ) ); sizeLimitCombo->insertItem(tr("Unlimited")); for(int i=1;i<13; i++) { sizeLimitCombo->insertItem( QString::number(i*5)); } // sizeLimitCombo->insertItem(tr("5 secs")); // sizeLimitCombo->insertItem(tr("10 secs")); // sizeLimitCombo->insertItem(tr("15 secs")); // sizeLimitCombo->insertItem(tr("20 secs")); // Layout18->addWidget( sizeGroup ); Layout17->addWidget( sizeGroup ); Layout18->addLayout( Layout17 ); Layout16 = new QHBoxLayout(this); Layout16->setSpacing( 2 ); Layout16->setMargin( 0 ); dirGroup = new QGroupBox( tab_3, "dirGroup" ); @@ -698,88 +698,88 @@ void QtRec::init() { TextLabel3->setText( tr( "Out" ) ); Layout15b->addWidget( TextLabel3 ); InputSlider = new QSlider( -100, 0, 10, 0, QSlider::Vertical, tab_3, (const char *) "InputSlider" ); // InputSlider->setTickmarks(QSlider::Both); Layout15->addWidget( InputSlider); OutputSlider = new QSlider( -100,0,10,0, QSlider::Vertical,tab_3,(const char *) "OutputSlider" ); // OutputSlider->setTickmarks(QSlider::Both); Layout15b->addWidget( OutputSlider ); outMuteCheckBox = new QCheckBox ( "mute", tab_3 ); Layout15->addWidget( outMuteCheckBox ); inMuteCheckBox = new QCheckBox ( "mute", tab_3 ); inMuteCheckBox-> setFocusPolicy ( QWidget::NoFocus ); Layout15b->addWidget( inMuteCheckBox ); Layout19->addLayout( Layout15 ); Layout19->addLayout( Layout15b ); fillDirectoryCombo(); TabWidget->insertTab( tab_3, tr( "Options" ) ); } ///**********<<<<<<<<<<<<>>>>>>>>>>>>*************** - tab_4 = new QWidget( TabWidget, "tab_4" ); - QGridLayout *layout4 = new QGridLayout( tab_4); - layout4->setSpacing( 2); - layout4->setMargin( 2); - TabWidget->insertTab( tab_4, tr( "Help")); - - ///////////////////////////////////////////// FIXME change to a real helpfile path - QString url="/index.html"; - HelpWindow *help = new HelpWindow( url, ".", tab_4, "opierec_help"); - layout4->addMultiCellWidget( help, 0, 1, 0, 1); - if( !QFile(url).exists()) { - help->hide(); - //help->showMaximized(); - QLabel *helpLabel; - helpLabel = new QLabel( tab_4, "TimeLabel" ); - layout4->addMultiCellWidget( helpLabel, 0, 3, 0, 4 ); - helpLabel->setText( "<B>OpieRec</B><br>" - "Records files in standard wav format<br>" - "or a compressed version<br>" - "For help, please email the author<br>" - "<B>OpieRec</B> is copyright© 2002 by" - " L.J. Potter<br>llornkcor@handhelds.org<BR>" - "and is licensed under the <B>QPL</B>"); - } +// tab_4 = new QWidget( TabWidget, "tab_4" ); +// QGridLayout *layout4 = new QGridLayout( tab_4); +// layout4->setSpacing( 2); +// layout4->setMargin( 2); +// TabWidget->insertTab( tab_4, tr( "Help")); + +// ///////////////////////////////////////////// FIXME change to a real helpfile path +// QString url="/index.html"; +// HelpWindow *help = new HelpWindow( url, ".", tab_4, "opierec_help"); +// layout4->addMultiCellWidget( help, 0, 1, 0, 1); +// if( !QFile(url).exists()) { +// help->hide(); +// //help->showMaximized(); +// QLabel *helpLabel; +// helpLabel = new QLabel( tab_4, "TimeLabel" ); +// layout4->addMultiCellWidget( helpLabel, 0, 3, 0, 4 ); +// helpLabel->setText( "<B>OpieRec</B><br>" +// "Records files in standard wav format<br>" +// "or a compressed version<br>" +// "For help, please email the author<br>" +// "<B>OpieRec</B> is copyright© 2002 by" +// " L.J. Potter<br>llornkcor@handhelds.org<BR>" +// "and is licensed under the <B>QPL</B>"); +// } ///**********<<<<<<<<<<<<>>>>>>>>>>>>*************** } void QtRec::initIconView() { ListView1->clear(); Config cfg("OpieRec"); cfg.setGroup("Sounds"); QString temp; QPixmap image0( ( const char** ) image0_data ); int nFiles = cfg.readNumEntry("NumberofFiles",0); for(int i=1;i<= nFiles;i++) { QListViewItem * item; QString fileS, mediaLocation, fileDate, filePath; // temp.sprintf("%d",i); temp=cfg.readEntry(temp,""); //reads currentFile filePath = cfg.readEntry(temp,""); //currentFileName QFileInfo info(filePath); fileDate = info.lastModified().toString(); fileS = cfg.readEntry( filePath, "0" );// file length in seconds mediaLocation=getStorage( filePath); if(info.exists()) { item = new QListViewItem( ListView1, temp, fileS, mediaLocation, fileDate); item->setPixmap( 0, image0); if(currentFileName == filePath) @@ -819,65 +819,65 @@ void QtRec::initConnections() { connect( timeSlider, SIGNAL( sliderReleased( )), this, SLOT( timeSliderReleased() )); connect( compressionCheckBox, SIGNAL( toggled(bool)),this, SLOT( compressionSelected(bool))); connect( autoMuteCheckBox, SIGNAL( toggled(bool)),this, SLOT( slotAutoMute(bool))); } void QtRec::initConfig() { int index, fred, i; Config cfg("OpieRec"); cfg.setGroup("Settings"); index = cfg.readNumEntry("samplerate",22050); bool ok; for(int ws=0;ws<sampleRateComboBox->count();ws++) { fred = sampleRateComboBox->text(ws).toInt(&ok, 10); if(index == fred) { filePara.sampleRate = fred; sampleRateComboBox->setCurrentItem(ws); } } i=cfg.readNumEntry("bitrate",16); if(i == 16) bitRateComboBox->setCurrentItem( 0); else bitRateComboBox->setCurrentItem( 1); filePara.resolution = i; i=cfg.readNumEntry("sizeLimit", 5 ); QString temp; // for(int i=1;i<13; i++) { // temp = sizeLimitCombo->text(i); - + // sizeLimitCombo->insertItem( QString::number(i*5)+tr(" secs")); // } sizeLimitCombo->setCurrentItem((i/5)); compressionCheckBox->setChecked( cfg.readBoolEntry("wavCompression",1)); if( compressionCheckBox->isChecked()) { bitRateComboBox->setEnabled(false); bitRateComboBox->setCurrentItem(0); filePara.resolution=16; } autoMuteCheckBox->setChecked( cfg.readBoolEntry("useAutoMute",0)); if( autoMuteCheckBox->isChecked()) slotAutoMute(true); else slotAutoMute(false); Config cofg( "qpe"); cofg.setGroup( "Volume"); outMuteCheckBox->setChecked( cofg.readBoolEntry( "Mute",0)); inMuteCheckBox->setChecked( cofg.readBoolEntry( "MicMute",0)); } //================ void QtRec::stop() { qDebug("<<<<<<<<<stop()"); setRecordButton(false); monitoring=false; stopped=true; if( !recording) @@ -901,66 +901,66 @@ void QtRec::doPlayBtn() { } } void QtRec::start() { //play if(stopped) { qDebug("start::"); QPixmap image3( ( const char** ) image3_data ); Stop_PushButton->setPixmap( image3 ); Stop_PushButton->setDown(true); stopped=false; paused=false; secCount=1; if( openPlayFile()) if( setupAudio( false)) //recording is false doPlay(); } } bool QtRec::rec() { //record qDebug("rec()"); if(!stopped) { qDebug("rec:: !stopped"); monitoring=true; return false; } else { qDebug("go ahead and record"); secCount=1; playLabel2->setText("Stop"); monitoring=false; setRecordButton(true); stopped=false; - - if( setupAudio( true)) + + if( setupAudio( true)) if(setUpFile()) { qDebug("Ok to start recording"); int fileSize=0; Config cfg("OpieRec"); cfg.setGroup("Settings"); qDebug( "<<<<<<<Device bits %d, device rate %d, device channels %d", soundDevice->getDeviceBits(), soundDevice->getDeviceRate(), soundDevice->getDeviceChannels()); //filePara.sampleRate = cfg.readNumEntry("samplerate", 22050); qDebug("sample rate is %d", filePara.sampleRate); filePara.SecondsToRecord = getCurrentSizeLimit(); qDebug("size limit %d sec", filePara.SecondsToRecord); int diskSize = checkDiskSpace( (const QString &) wavFile->trackName()); if( filePara.SecondsToRecord == 0) { fileSize = diskSize; } else if( filePara.format==WAVE_FORMAT_PCM) { qDebug("WAVE_FORMAT_PCM"); fileSize = (filePara.SecondsToRecord ) * filePara.channels * filePara.sampleRate *(filePara.resolution/8)+1000; } else { qDebug("WAVE_FORMAT_DVI_ADPCM"); fileSize = ((filePara.SecondsToRecord) * filePara.channels * filePara.sampleRate *(filePara.resolution/8) )/4+250; } filePara.samplesToRecord = fileSize; qDebug("filesize should be %d, bits %d, rate %d", filePara.samplesToRecord, filePara.resolution, filePara.sampleRate); @@ -971,65 +971,65 @@ bool QtRec::rec() { //record qDebug("Setting timeslider %d", filePara.samplesToRecord); // if(fileSize != 0) timeSlider->setRange(0, filePara.samplesToRecord); // } if( diskSize < fileSize/1024) { QMessageBox::warning(this, tr("Low Disk Space"), tr("You are running low of\nrecording space\n" "or a card isn't being recognized")); stopped = true; //we need to be stopped stop(); } else { QString msg; msg.sprintf("%d, %d, %d", filePara.sampleRate, filePara.channels, filePara.resolution); #ifdef DEV_VERSION setCaption( msg); #endif filePara.fileName=currentFile.latin1(); qDebug("Start recording thread"); pthread_t thread1; pthread_create( &thread1, NULL, (void * (*)(void *))quickRec, NULL/* &*/); // quickRec(); toBeginningButton->setEnabled(false); toEndButton->setEnabled(false); startTimer(1000); } } //end setUpFile } //end setupAudio // _exit( 0); - + // ///* default: // // /* pid greater than zero is parent getting the child's pid */ // /* printf("Child's pid is %d\n",pid); // waitpid( pid, &status, 0); // printf("Child[%d] exited with status %d\n", pid, status);*/ // while (wait(NULL) != pid) // ; // printf("child %ld terminated normally, return status is zero\n", (long) pid); // endRecording(); /* else { //device was not opened qDebug("Audio device open failed"); return false; } }*/ // } //end fork // } // } return true; } /* This happens when a tab is selected*/ void QtRec::thisTab(QWidget* widg) { if(widg != NULL) { int index=TabWidget->currentPageIndex(); if(index==0) { //file page } if(index ==1) { //control page fillDirectoryCombo(); // soundDevice->getOutVol(); // soundDevice->getInVol(); @@ -1087,75 +1087,75 @@ bool QtRec::setupAudio( bool b) { } else { // we want to record qDebug("setting up DSP for recording"); if( !bitRateComboBox->isEnabled() || bitRateComboBox->currentText() == "16") sampleformat = AFMT_S16_LE; else sampleformat = AFMT_U8; if( !compressionCheckBox->isChecked()) { filePara.format=WAVE_FORMAT_PCM; qDebug("WAVE_FORMAT_PCM"); } else { filePara.format=WAVE_FORMAT_DVI_ADPCM; sampleformat=AFMT_S16_LE; qDebug("WAVE_FORMAT_DVI_ADPCM"); } stereo = filePara.channels = 1; // filePara.sampleRate = sampleRateComboBox->currentText().toInt( &ok,10);//44100; flags= O_RDWR; // flags= O_RDONLY; dspString = DSPSTRIN; mixerString = DSPSTRMIXEROUT; } // if(soundDevice) delete soundDevice; qDebug("<<<<<<<<<<<<<<<<<<<open dsp %d %d %d", filePara.sampleRate, filePara.channels, sampleformat); soundDevice = new Device( this, dspString, mixerString, b); // soundDevice->openDsp(); soundDevice->reset(); qDebug("device has been made %d", soundDevice->sd); - + ////////////////// <<<<<<<<<<<<>>>>>>>>>>>> soundDevice->setDeviceFormat( sampleformat); soundDevice->setDeviceChannels( filePara.channels); soundDevice->setDeviceRate( filePara.sampleRate); soundDevice->getDeviceFragSize(); -#ifdef QT_QWS_EBX +#ifdef QT_QWS_EBX int frag = FRAGSIZE; soundDevice->setFragSize( frag); soundDevice->getDeviceFragSize(); -#endif +#endif ///////////////// filePara.sd = soundDevice->sd; if ( filePara.sd == -1) { monitoring=false; stopped=true; update(); setCaption( tr( "OpieRecord " ) + QString::number(VERSION) ); stopped=true; return false; } if(autoMute) doMute(false); return true; } bool QtRec::setUpFile() { //setup file for recording qDebug("Setting up wavfile"); // if(wavFile) delete wavFile; wavFile = new WavFile( this, (const QString &)"", true, filePara.sampleRate, filePara.channels, filePara.resolution, filePara.format); filePara.fd = wavFile->wavHandle(); if(filePara.fd == -1) { return false; @@ -1322,69 +1322,69 @@ bool QtRec::doPlay() { // qDebug("\nstopped or paused %d", total/4); if(!paused && !stopped) { stopped = true; // endPlaying(); endPlaying(); } return true; } void QtRec::changebitrateCombo(int i) { Config cfg("OpieRec"); cfg.setGroup("Settings"); int bits=0; if(i==0) { bits=16; } else { bits=8; } cfg.writeEntry("bitrate", bits); filePara.resolution=bits; cfg.write(); } void QtRec::changesamplerateCombo(int i) { Config cfg("OpieRec"); cfg.setGroup("Settings"); int rate=0; bool ok; rate = sampleRateComboBox->text(i).toInt(&ok, 10); cfg.writeEntry("samplerate",rate); filePara.sampleRate=rate; /* soundDevice = new Device( this, DSPSTROUT, DSPSTRMIXER, false); soundDevice->openDsp();*/ -// +// // soundDevice->setDeviceFormat(AFMT_S16_LE); // soundDevice->setDeviceChannels(filePara.channels); // soundDevice->setDeviceRate(filePara.sampleRate); -// +// // soundDevice->closeDevice( true); // soundDevice=0; // delete soundDevice; qDebug("Change sample rate %d", rate); cfg.write(); } void QtRec::changeDirCombo(int index) { Config cfg("OpieRec"); cfg.setGroup("Settings"); QString sName = directoryComboBox->text(index); StorageInfo storageInfo; const QList<FileSystem> &fs = storageInfo.fileSystems(); QListIterator<FileSystem> it ( fs ); QString storage; for( ; it.current(); ++it ){ if( sName == (*it)->name()+" "+ (*it)->path() || (*it)->name() == sName ) { const QString path = (*it)->path(); recDir = path; cfg.writeEntry("directory", recDir); qDebug("new rec dir "+recDir); } } cfg.write(); } void QtRec::changeSizeLimitCombo(int) { @@ -1960,65 +1960,65 @@ long QtRec::checkDiskSpace(const QString &path) { long div = 1024 / blkSize; if ( !mult ) mult = 1; if ( !div ) div = 1; return availBlks * mult / div; } return -1; } // short f_fstyp; /* File system type */ // long f_bsize; /* Block size */ // long f_frsize; /* Fragment size */ // long f_blocks; /* Total number of blocks*/ // long f_bfree; /* Count of free blocks */ // long f_files; /* Total number of file nodes */ // long f_ffree; /* Count of free file nodes */ // char f_fname[6]; /* Volumename */ // char f_fpack[6]; /* Pack name */ void QtRec::receive( const QCString &msg, const QByteArray & ) { qDebug("Voicerecord received message "+msg); } ///////////////////////////// timerEvent void QtRec::timerEvent( QTimerEvent *e ) { // qDebug( "%d", secCount ); #ifdef DEV_VERSION QString msg; msg.sprintf("%d, %d, %d", filePara.sampleRate, filePara.channels, filePara.resolution); - setCaption( msg +" :: "+QString::number(secCount)); + setCaption( msg +" :: "+QString::number(secCount)); #endif if( !playing ) { if(!recording ){ killTimer(e->timerId()); ///* stopped=true; // recording=false; ///*/ // _exit( 0); } if(filePara.SecondsToRecord < secCount && filePara.SecondsToRecord !=0) { killTimer(e->timerId()); stop(); } } // if( stopped && !paused) { // if( filePara.numberOfRecordedSeconds < secCount) { // stopped = true; // // playing=false; // killTimer(e->timerId()); // endPlaying(); // } // } // qApp->processEvents(); secCount++; } void QtRec::changeTimeSlider(int index) { if(ListView1->currentItem() == 0 || !wavFile->track.isOpen()) return; // qDebug("Slider moved to %d",index); paused = true; stopped = true; @@ -2229,42 +2229,42 @@ void QtRec::slotAutoMute(bool b) { cfg.writeEntry("useAutoMute",b); doMute(b); outMuteCheckBox->setChecked( b); inMuteCheckBox->setChecked( b); } void QtRec::selectItemByName(const QString & name) { QListViewItemIterator it( ListView1 ); for ( ; it.current(); ++it ) if(name == it.current()->text(0)) ListView1->setCurrentItem(it.current()); } long findPeak(long input ) { // halfLife = time in seconds for output to decay to half value after an impulse static float output = 0.0; int halfLife = .25; float vsf = .0025; float scalar = pow( 0.5, 1.0/(halfLife * filePara.sampleRate )); if( input < 0.0 ) input = -input; // Absolute value. if ( input >= output ) { // When we hit a peak, ride the peak to the top. output = input; } else { // Exponential decay of output when signal is low. output = output * scalar; -// +// // When current gets close to 0.0, set current to 0.0 to prevent FP underflow // which can cause a severe performance degradation due to a flood // of interrupts. // if( output < vsf ) output = 0.0; } return output; } |