![]() |
Mixxx
|
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