bool EngineRecord::openFile() { // Unfortunately, we cannot use QFile for writing WAV and AIFF audio. if (m_encoding == ENCODING_WAVE || m_encoding == ENCODING_AIFF){ unsigned long samplerate = m_pSamplerate->get(); // set sfInfo m_sfInfo.samplerate = samplerate; m_sfInfo.channels = 2; if (m_encoding == ENCODING_WAVE) m_sfInfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16; else m_sfInfo.format = SF_FORMAT_AIFF | SF_FORMAT_PCM_16; // Creates a new WAVE or AIFF file and writes header information. m_pSndfile = sf_open(m_fileName.toLocal8Bit(), SFM_WRITE, &m_sfInfo); if (m_pSndfile) { sf_command(m_pSndfile, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; // Set meta data int ret; ret = sf_set_string(m_pSndfile, SF_STR_TITLE, m_baTitle.data()); if(ret != 0) qDebug("libsndfile: %s", sf_error_number(ret)); ret = sf_set_string(m_pSndfile, SF_STR_ARTIST, m_baAuthor.data()); if(ret != 0) qDebug("libsndfile: %s", sf_error_number(ret)); ret = sf_set_string(m_pSndfile, SF_STR_COMMENT, m_baAlbum.data()); if(ret != 0) qDebug("libsndfile: %s", sf_error_number(ret)); } } else { // We can use a QFile to write compressed audio. if (m_pEncoder) { m_file.setFileName(m_fileName); m_file.open(QIODevice::WriteOnly); if (m_file.handle() != -1) { m_dataStream.setDevice(&m_file); } } else { return false; } } // Check if file is really open. if (!fileOpen()) { ErrorDialogProperties* props = ErrorDialogHandler::instance()->newDialogProperties(); props->setType(DLG_WARNING); props->setTitle(tr("Recording")); props->setText("<html>"+tr("Could not create audio file for recording!") +"<p><br>"+tr("Maybe you do not have enough free disk space or file permissions.")+"</p></html>"); ErrorDialogHandler::instance()->requestErrorDialog(props); return false; } return true; }
void EngineShoutcast::infoDialog(QString text, QString detailedInfo) { ErrorDialogProperties* props = ErrorDialogHandler::instance()->newDialogProperties(); props->setType(DLG_INFO); props->setTitle(tr("Live broadcasting")); props->setText(text); props->setDetails(detailedInfo); props->setKey(text + detailedInfo); props->setDefaultButton(QMessageBox::Close); props->setModal(false); ErrorDialogHandler::instance()->requestErrorDialog(props); }
void EngineShoutcast::errorDialog(QString text, QString detailedError) { qWarning() << "Shoutcast error: " << detailedError; ErrorDialogProperties* props = ErrorDialogHandler::instance()->newDialogProperties(); props->setType(DLG_WARNING); props->setTitle(tr("Live broadcasting")); props->setText(text); props->setDetails(detailedError); props->setKey(detailedError); // To prevent multiple windows for the same error props->setDefaultButton(QMessageBox::Close); props->setModal(false); ErrorDialogHandler::instance()->requestErrorDialog(props); }
void MidiController::createOutputHandlers() { if (m_preset.outputMappings.isEmpty()) { return; } QHashIterator<ConfigKey, MidiOutputMapping> outIt(m_preset.outputMappings); QStringList failures; while (outIt.hasNext()) { outIt.next(); const MidiOutputMapping& mapping = outIt.value(); QString group = mapping.control.group; QString key = mapping.control.item; unsigned char status = mapping.output.status; unsigned char control = mapping.output.control; unsigned char on = mapping.output.on; unsigned char off = mapping.output.off; double min = mapping.output.min; double max = mapping.output.max; controllerDebug(QString( "Creating output handler for %1,%2 between %3 and %4 to MIDI out: 0x%5 0x%6, on: 0x%7 off: 0x%8") .arg(group, key, QString::number(min), QString::number(max), QString::number(status, 16).toUpper(), QString::number(control, 16).toUpper().rightJustified(2,'0'), QString::number(on, 16).toUpper().rightJustified(2,'0'), QString::number(off, 16).toUpper().rightJustified(2,'0'))); MidiOutputHandler* moh = new MidiOutputHandler(this, mapping); if (!moh->validate()) { QString errorLog = QString("MIDI output message 0x%1 0x%2 has invalid MixxxControl %3, %4") .arg(QString::number(status, 16).toUpper(), QString::number(control, 16).toUpper().rightJustified(2,'0')) .arg(group, key).toUtf8(); qWarning() << errorLog; int deckNum = 0; if (ControllerDebug::enabled()) { failures.append(errorLog); } else if (PlayerManager::isDeckGroup(group, &deckNum)) { int numDecks = PlayerManager::numDecks(); if (deckNum <= numDecks) { failures.append(errorLog); } } delete moh; continue; } m_outputs.append(moh); } if (!failures.isEmpty()) { ErrorDialogProperties* props = ErrorDialogHandler::instance()->newDialogProperties(); props->setType(DLG_WARNING); props->setTitle(tr("MixxxControl(s) not found")); props->setText(tr("One or more MixxxControls specified in the " "outputs section of the loaded preset were invalid.")); props->setInfoText(tr("Some LEDs or other feedback may not work correctly.")); QString detailsText = tr("* Check to see that the MixxxControl " "names are spelled correctly in the mapping " "file (.xml)\n"); detailsText += tr("* Make sure the MixxxControls in question actually exist." " Visit this wiki page for a complete list: "); detailsText += "http://mixxx.org/wiki/doku.php/mixxxcontrols\n\n"; detailsText += failures.join("\n"); props->setDetails(detailsText); ErrorDialogHandler::instance()->requestErrorDialog(props); } }
bool EngineRecord::openFile() { // Unfortunately, we cannot use QFile for writing WAV and AIFF audio. if (m_encoding == ENCODING_WAVE || m_encoding == ENCODING_AIFF){ unsigned long samplerate = m_pSamplerate->get(); // set sfInfo m_sfInfo.samplerate = samplerate; m_sfInfo.channels = 2; if (m_encoding == ENCODING_WAVE) m_sfInfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16; else m_sfInfo.format = SF_FORMAT_AIFF | SF_FORMAT_PCM_16; // Creates a new WAVE or AIFF file and writes header information. #ifdef __WINDOWS__ LPCWSTR lpcwFilename = (LPCWSTR)m_fileName.utf16(); //Pointer valid until string changed m_pSndfile = sf_wchar_open( lpcwFilename, SFM_WRITE, &m_sfInfo); #else QByteArray qbaFilename = m_fileName.toUtf8(); m_pSndfile = sf_open(qbaFilename.data(), SFM_WRITE, &m_sfInfo); #endif if (m_pSndfile) { sf_command(m_pSndfile, SFC_SET_NORM_FLOAT, NULL, SF_FALSE) ; // Set meta data int ret; ret = sf_set_string(m_pSndfile, SF_STR_TITLE, m_baTitle.data()); if(ret != 0) qDebug("libsndfile: %s", sf_error_number(ret)); ret = sf_set_string(m_pSndfile, SF_STR_ARTIST, m_baAuthor.data()); if(ret != 0) qDebug("libsndfile: %s", sf_error_number(ret)); ret = sf_set_string(m_pSndfile, SF_STR_COMMENT, m_baAlbum.data()); if(ret != 0) qDebug("libsndfile: %s", sf_error_number(ret)); } } else { // We can use a QFile to write compressed audio. if (m_pEncoder) { m_file.setFileName(m_fileName); m_file.open(QIODevice::WriteOnly); if (m_file.handle() != -1) { m_dataStream.setDevice(&m_file); } } else { return false; } } // Check if file is really open. if (!fileOpen()) { ErrorDialogProperties* props = ErrorDialogHandler::instance()->newDialogProperties(); props->setType(DLG_WARNING); props->setTitle(tr("Recording")); props->setText("<html>"+tr("Could not create audio file for recording!") +"<p>"+tr("Ensure there is enough free disk space and you have write permission for the Recordings folder.") +"<p>"+tr("You can change the location of the Recordings folder in Preferences > Recording.") +"</p></html>"); ErrorDialogHandler::instance()->requestErrorDialog(props); return false; } return true; }