Mixxx

/home/maxime/Projets/Mixxx/1.10/mixxx/src/recording/recordingmanager.cpp

Go to the documentation of this file.
00001 /*
00002  * Created 03/26/2011 by Tobias Rafreider
00003  */
00004 #include <QMutex>
00005 #include <QDir>
00006 #include "recordingmanager.h"
00007 #include "recording/defs_recording.h"
00008 #include "controlpushbutton.h"
00009 
00010 #define CD_650
00011 
00012 RecordingManager::RecordingManager(ConfigObject<ConfigValue>* pConfig) :
00013         m_pConfig(pConfig),
00014         m_recordingDir(""),
00015         m_recording_base_file(""),
00016         m_recordingFile(""),
00017         m_recordingLocation(""),
00018         m_isRecording(false),
00019         m_iNumberOfBytesRecored(0),
00020         m_split_size(0),
00021         m_iNumberSplits(0) {
00022     m_pToggleRecording = new ControlPushButton(ConfigKey("[Master]", "toggle_recording"));
00023     connect(m_pToggleRecording, SIGNAL(valueChanged(double)),
00024             this, SLOT(slotToggleRecording(double)));
00025     m_recReadyCO = new ControlObject(ConfigKey("[Master]", "Record"));
00026     m_recReady = new ControlObjectThread(m_recReadyCO);
00027 
00028     QDir os_music_folder_dir(m_pConfig->getValueString(ConfigKey("[Playlist]", "Directory")));
00029     //Check if there's a folder Mixxx within the music directory
00030     QDir mixxxDir(os_music_folder_dir.absolutePath() +"/Mixxx");
00031 
00032 
00033     if(!mixxxDir.exists()) {
00034 
00035         if(os_music_folder_dir.mkdir("Mixxx")) {
00036             qDebug() << "Created folder 'Mixxx' within default OS Music directory";
00037 
00038             if(mixxxDir.mkdir("Recordings"))
00039                 qDebug() << "Created folder 'Recordings' successfully";
00040             else
00041                 qDebug() << "Could not create folder 'Recordings' within 'Mixxx'";
00042         }
00043         else{
00044             qDebug() << "Failed to create folder 'Mixxx'' within default OS Music directory."
00045                      << "Please verify that there's no file called 'Mixxx'.";
00046         }
00047     }
00048     else{ // the Mixxx directory already exists
00049         qDebug() << "Found folder 'Mixxx' within default OS music directory";
00050         QDir recordDir(mixxxDir.absolutePath() +"Recordings");
00051         if(!recordDir.exists()) {
00052             if(mixxxDir.mkdir("Recordings"))
00053                 qDebug() << "Created folder 'Recordings' successfully";
00054             else
00055                 qDebug() << "Could not create folder 'Recordings' within 'Mixxx'";
00056         }
00057     }
00058     m_recordingDir = os_music_folder_dir.absolutePath() +"/Mixxx/Recordings";
00059     m_split_size = getFileSplitSize();
00060 }
00061 
00062 RecordingManager::~RecordingManager()
00063 {
00064     qDebug() << "Delete RecordingManager";
00065     delete m_recReadyCO;
00066     delete m_recReady;
00067 }
00068 
00069 QString RecordingManager::formatDateTimeForFilename(QDateTime dateTime) const {
00070     // Use a format based on ISO 8601
00071     QString formatted = dateTime.toString("yyyy-MM-dd_hh'h':mm'm':ss's'");
00072 #ifdef __WINDOWS__
00073     // Windows does not support colons in filenames.
00074     formatted = formatted.replace(":", "");
00075 #endif
00076     return formatted;
00077 }
00078 
00079 void RecordingManager::slotToggleRecording(double v) {
00080     if (v > 0) {
00081         if (isRecordingActive()) {
00082             stopRecording();
00083         } else {
00084             startRecording();
00085         }
00086     }
00087 }
00088 
00089 void RecordingManager::startRecording(bool generateFileName) {
00090     m_iNumberOfBytesRecored = 0;
00091     m_split_size = getFileSplitSize();
00092     QString encodingType = m_pConfig->getValueString(
00093             ConfigKey("[Recording]", "Encoding"));
00094 
00095     if(generateFileName) {
00096         m_iNumberSplits = 1;
00097         //Append file extension
00098         QString date_time_str = formatDateTimeForFilename(QDateTime::currentDateTime());
00099         m_recordingFile = QString("%1.%2")
00100                 .arg(date_time_str)
00101                 .arg(encodingType.toLower());
00102 
00103         //Storing the absolutePath of the recording file without file extension
00104         m_recording_base_file = m_recordingDir;
00105         m_recording_base_file.append("/").append(date_time_str);
00106         //appending file extension to get the filelocation
00107         m_recordingLocation = m_recording_base_file + "."+ encodingType.toLower();
00108         m_pConfig->set(ConfigKey("[Recording]", "Path"), m_recordingLocation);
00109         m_pConfig->set(ConfigKey("[Recording]", "CuePath"), m_recording_base_file +".cue");
00110     } else {
00111         //This is only executed if filesplit occurs
00112         ++m_iNumberSplits;
00113         QString new_base_filename = m_recording_base_file +"part"+QString::number(m_iNumberSplits);
00114         m_recordingLocation = new_base_filename + "." +encodingType.toLower();
00115 
00116         m_pConfig->set(ConfigKey("[Recording]", "Path"), m_recordingLocation);
00117         m_pConfig->set(ConfigKey("[Recording]", "CuePath"), new_base_filename +".cue");
00118         m_recordingFile = QFileInfo(m_recordingLocation).fileName();
00119     }
00120     m_recReady->slotSet(RECORD_READY);
00121 }
00122 
00123 void RecordingManager::stopRecording()
00124 {
00125     qDebug() << "Recording stopped";
00126     m_recReady->slotSet(RECORD_OFF);
00127     m_recordingFile = "";
00128     m_recordingLocation = "";
00129     m_iNumberOfBytesRecored = 0;
00130 }
00131 
00132 QString& RecordingManager::getRecordingDir() {
00133     return m_recordingDir;
00134 }
00135 
00136 //Only called when recording is active
00137 void RecordingManager::slotBytesRecorded(int bytes)
00138 {
00139     //auto conversion to long
00140     m_iNumberOfBytesRecored += bytes;
00141     if(m_iNumberOfBytesRecored >= m_split_size)
00142     {
00143         //stop and start recording
00144         stopRecording();
00145         //Dont generate a new filename
00146         //This will reuse the previous filename but appends a suffix
00147         startRecording(false);
00148     }
00149     emit(bytesRecorded(m_iNumberOfBytesRecored));
00150 }
00151 
00152 void RecordingManager::slotIsRecording(bool isRecordingActive)
00153 {
00154     //qDebug() << "SlotIsRecording " << isRecording;
00155 
00156     //Notify the GUI controls, see dlgrecording.cpp
00157     m_isRecording = isRecordingActive;
00158     emit(isRecording(isRecordingActive));
00159 }
00160 
00161 bool RecordingManager::isRecordingActive() {
00162     return m_isRecording;
00163 }
00164 
00165 //returns the name of the file
00166 QString& RecordingManager::getRecordingFile() {
00167     return m_recordingFile;
00168 }
00169 
00170 QString& RecordingManager::getRecordingLocation() {
00171     return m_recordingLocation;
00172 }
00173 
00174 long RecordingManager::getFileSplitSize()
00175 {
00176      QString fileSizeStr = m_pConfig->getValueString(ConfigKey("[Recording]","FileSize"));
00177      if(fileSizeStr == SPLIT_650MB)
00178          return SIZE_650MB;
00179      else if(fileSizeStr == SPLIT_700MB)
00180          return SIZE_700MB;
00181      else if(fileSizeStr == SPLIT_1024MB)
00182          return SIZE_1GB;
00183      else if(fileSizeStr == SPLIT_2048MB)
00184          return SIZE_2GB;
00185      else if(fileSizeStr == SPLIT_4096MB)
00186          return SIZE_4GB;
00187      else
00188          return SIZE_650MB;
00189 }
00190 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines