www.pudn.com > wav_mp3_recorder.rar > mediarecorder.cpp


#include 
#include 
#include 
#include 
#include 
#include 

#include 
#include 
#include 
#include 
#include 
#include 

#include "mediarecorder.h"
#include "mediarecorderbase.h"
#include "timeprogressbar.h"
#include "waveform.h"

#include "playlistbase.h"

#define timesec   100
#define sizes     512

QString path = QPEApplication::qpeDir();

MediaRecorder::MediaRecorder( QWidget *parent, const char *name, WFlags f )
    : QMainWindow( parent, name, f )
{

    setToolBarsMovable( FALSE );
    setBackgroundMode( PaletteButton );
    setCaption( tr("Voice Recorder --Whut") );

	  QFont hevia("helvetica", 12);
    hevia.setPixelSize(12);
    setFont( hevia );

    setIcon( Resource::loadPixmap( "SoundPlayer" ) );

    stack = new QWidgetStack( this );
    stack->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
    setCentralWidget( stack );

    contents = new MediaRecorderBase( stack );
    stack->addWidget( contents, 0 );
      
    initializeContents();
    stack->raiseWidget( contents );

   // sampleBuffer = 0;
    process = 0;
    recordTime = 0;
    tenTimes = 0;
    recording = FALSE;
    playing = FALSE;
    read_data = 0;
    wave_mp3_id = 0;
    loopTimes = 1000/timesec;
    
    //lightTimer = new QTimer( this );
    sample_Timer = new QTimer(this);
    get_sample_data();
    
    connect( contents->recordButton, SIGNAL( clicked() ),
	     this, SLOT(recordClicked()) ); //// mp3_encode()
	  connect( contents->Group, SIGNAL(clicked(int)),
	     this, SLOT(changebid(int)) );
	  connect( contents->replayButton, SIGNAL(clicked()),
	     this, SLOT( replayclicked()));
	  connect(sample_Timer, SIGNAL(timeout()),
	     this, SLOT(ShowWaveData()));	  
}

MediaRecorder::~MediaRecorder()
{
   if ( sampleBuffer )
	delete[] sampleBuffer;

	 if(sample_Timer)
	 	delete sample_Timer;
}


void MediaRecorder::initializeContents()
{
	  qualities.frequency = 8000;
	  qualities.channels = 1;
	  
	 // playbase = new PlayListBase(this, "playbase");
    contents->waveform->setBackgroundColor ( black );
    contents->progress->setTotalSteps( 10 );
    contents->progress->setProgress( -1 ); 
}

void MediaRecorder::changebid(int index)
{
	wave_mp3_id = index;
	qDebug("index = %d", index);
}

void MediaRecorder::loadplay()
{
	PlayListBase playbase(this);
	if( playbase.exec()) {
	   //qDebug("PlayListBase ok");
	   playing = TRUE;
	   contents->replayButton->setText(tr("stop"));
	   contents->recordButton->setEnabled(FALSE);
	   contents->Group->setEnabled(FALSE);
	   sample_Timer->start(timesec, FALSE );
	   QString filename = playbase.get_playfile_name();
	   //qDebug(filename);
	   play_mp3_wav(filename);                //start playing
	  //play_mp3_wav("/home/music/4.mp3");
  }
}

void MediaRecorder::startSave()
{
   QString hms = tr("Recorded Sound_%1").arg(TimeString::localHMS(QTime::currentTime()));
   hms.replace( QRegExp(":"), "_" );
  // qDebug(hms);
   lastSaved = "/Documents/audio/record/";
   lastSaved = lastSaved.append(hms);;
   //qDebug(lastSaved);

 if (wave_mp3_id == 0)
    lastSaved = lastSaved.append(".mp3");
 else if(wave_mp3_id == 1)
  	lastSaved = lastSaved.append(".wav");
  qDebug(lastSaved);
}


void MediaRecorder::startRecording()
{ 
   // get_sample_data();
	  QPEApplication::setTempScreenSaverMode( QPEApplication::DisableSuspend ); 
    startSave();

    contents->waveform->changeSettings(qualities.frequency,
					 qualities.channels);

    contents->progress->setTotalSteps( 120 );
    contents->progress->setProgress( 0 );
    contents->progress->setRecording();
    recording = TRUE;
    contents->recordButton->setText( tr("Stop") );
    contents->recordButton->setEnabled( TRUE );
    contents->replayButton->setEnabled( FALSE);
	contents->Group->setEnabled(FALSE);

    sample_Timer->start(timesec, FALSE );
    mp3_encode();
    ShowWaveData();
    
}


void MediaRecorder::stopRecording()
{
    contents->waveform->reset();
    contents->recordButton->setEnabled( TRUE );
    recording = FALSE;
    contents->recordButton->setText( tr("Record") );
    sample_Timer->stop();
    contents->replayButton->setEnabled(TRUE);
	  contents->Group->setEnabled(TRUE);
    contents->progress->setProgress(0);
    recordTime = 0;
    kill(pidtomp3, SIGUSR1);
    QPEApplication::setTempScreenSaverMode( QPEApplication::Enable );
}


void MediaRecorder::recordClicked()
{
    if ( recording ) {
	stopRecording();
    } else {
	startRecording();
    }
}

void MediaRecorder::ShowWaveData()
{   
	int i = 1000/timesec;
	 if( tenTimes < i ) {
	 	   tenTimes++;
	  }
	  else {
	  	tenTimes = 0;
	    contents->progress->setProgress( ++recordTime );
	  }
           if(recordTime > contents->progress->totalSteps())
              contents->progress->setTotalSteps( contents->progress->totalSteps()*4);
	  contents->waveform->newSamples( sampleBuffer, sizes );
}

void MediaRecorder::mp3_encode()
{
	if( process )
		 delete process;
	process = new QProcess(this);
	QString bin_name = path + "bin/rec";
	qDebug(bin_name);
	process->addArgument(bin_name); //"/home/x86-qtopia/qtopia/bin/rec"
	if(wave_mp3_id == 0)
	   process->addArgument("-m");
	else if(wave_mp3_id == 1)
		 process->addArgument("-w");
	process->addArgument(lastSaved);
	connect( process, SIGNAL( processExited() ),
           this, SLOT( Exit()) );
           
	process->start();
	pidtomp3 = process->processIdentifier();
	qDebug("process's pid is %d", (int)pidtomp3);
}

void MediaRecorder::Exit()
{
   if ( process->normalExit() )
	  	  qDebug( "Recorde Successed!" );
	  else
	  	  qDebug( "Process Not normalexit!" ); 
	  delete process;
	  process = 0;
}


void MediaRecorder::replayclicked()
{
	if ( playing ) {
		stopplay();
	}
	else {
		startplay();
	}
		 
}
void MediaRecorder::startplay()
{
	 contents->waveform->changeSettings(qualities.frequency,
					qualities.channels);
	    contents->progress->setTotalSteps( 120 );
   contents->progress->setProgress( 0 );
   contents->progress->setRecording();
	 loadplay(); 
}

void MediaRecorder::tellmp(const QString & command) {
	//if (process->isRunning()) 
		process->writeToStdin(command + "\n");
}

void MediaRecorder::stopplay()
{
	 playing = FALSE;
	 contents->replayButton->setText(tr("Repaly"));
   sample_Timer->stop();
   contents->waveform->reset();
   contents->recordButton->setEnabled(TRUE);
   contents->Group->setEnabled(TRUE);
   recordTime = 0;
   contents->progress->setProgress(0);
     if(!process->isRunning()) {
		return;
	}
	tellmp("quit");
  // process->tryTerminate();
  // QTimer::singleShot( 5000, process, SLOT( kill() ) );
}
	
void MediaRecorder::get_sample_data()
{
		//if ( sampleBuffer )
  	//  delete[] sampleBuffer;
    sampleBuffer = new short [256];
    QString path_name = path + "pics/sample.txt";
    qDebug(path_name);
    FILE* file = fopen(path_name, "rb"); //"/home/x86-qtopia/qtopia/pics/sample.txt"
    if(file == NULL) {
    	qDebug("Fails on open wav file");
    	return;
    }
    fseek(file, 44, SEEK_SET);
    read_data = fread(sampleBuffer, sizeof(short), 256, file);
    fclose(file);
}

void MediaRecorder::play_mp3_wav(const QString& fileName)
{
	//qDebug(fileName);
	if(process)
		  delete process;
	process = new QProcess(this);
	process->addArgument("/home/MPlayer-1.0rc1/mplayer");  //加入板子上的mplayer路径
	process->addArgument(fileName);
	connect( process, SIGNAL( processExited() ),
           this, SLOT( PlayExit()) );
           
	process->start();
	qDebug("process's pid is %d", (int)process->processIdentifier());
}

void MediaRecorder::PlayExit()
{  
	 playing = FALSE;
	 contents->replayButton->setText(tr("Repaly"));
   sample_Timer->stop();
   contents->waveform->reset();
   contents->recordButton->setEnabled(TRUE);
   contents->Group->setEnabled(TRUE);
   recordTime = 0;
   contents->progress->setProgress(0);
	  if ( process->normalExit() )
	  	  qDebug( "Playing Over Sucessed end!" );
	  else
	  	  qDebug( "Process Not normalexit!" ); 
	  delete process;
	  process = 0;
}