Exemple #1
0
//Encodes the audio data into a WAV file
void coder::encode(AudioData * data, string filename){
    ofstream audioFile(filename, ios::binary);

    if(audioFile.is_open()){
        audioFile.write(data->getRIFF(), 4);

        int fileSize = data->getFileSize();
        audioFile.write((char *)&fileSize, 4);

        audioFile.write(data->getFileType(), 4);

        audioFile.write(data->getFormat(), 4);

        unsigned int infoSize = data->getFormatInfoSize();
        audioFile.write((char *)&infoSize, 4);

        audioFile.write(data->getFormatInfo(), infoSize);

        audioFile.write(data->getDataChunk(), 4);

        unsigned int dataSize = data->getDataSize();
        audioFile.write((char *)&dataSize, 4);

        short ** channelData = data->getChannelData();
        short * combinedData = combineChannels(channelData, data->getChannels(), data->getNumberOfSamples());
        audioFile.write((char *)combinedData, dataSize);

        audioFile.close();
    }
}
Exemple #2
0
AudioFilePlayer::AudioFilePlayer(const String& path)
:	currentAudioFileSource(0),
	sampleRate(0.0),
	reciprocalSampleRate(0.0)
{
	File audioFile(path);
	setFile(audioFile);
}
void PlayerComponent::buttonClicked (Button* buttonThatWasClicked)
{
    if (buttonThatWasClicked == browseButton)
    {
        FileChooser fileChooser(T("Select an audio file to open..."),
                                _lastWorkingDirectory,
                                _audioFormatManager.getWildcardForAllFormats(),
                                false);

        if(fileChooser.browseForFileToOpen())
        {
            File audioFile(fileChooser.getResult());
            _lastWorkingDirectory = audioFile.getParentDirectory();

            AudioFormatReader *fileReader = _audioFormatManager.createReaderFor(audioFile);

            if(fileReader)
            {
                _transportSource.stop();
                _transportSource.setSource(0);

                filenameLabel->setText(audioFile.getFileName(), false);

                delete _fileReaderSource;
                _fileReaderSource = new AudioFormatReaderSource(fileReader, true);
                _fileReaderSource->setLooping(loopButton->getToggleState());
                _transportSource.setSource(_fileReaderSource, 32768, fileReader->sampleRate);
                _transportSource.setPosition(.0f);

                _totalTime = double(fileReader->lengthInSamples) / double(fileReader->sampleRate);
                timeSlider->setRange(.0, _totalTime, 1.);
                timeSlider->setValue(.0, false, false);

                setCurrentTime();
            }
        }
    }
    else if (buttonThatWasClicked == playButton)
    {
        if(_transportSource.isPlaying())
            _transportSource.stop();
        else
            _transportSource.start();
    }
    else if (buttonThatWasClicked == stopButton)
    {
        _transportSource.stop();
        _transportSource.setPosition(0);

        setCurrentTime();
    }
    else if (buttonThatWasClicked == loopButton)
    {
        if(_fileReaderSource)
            _fileReaderSource->setLooping(loopButton->getToggleState());
    }
}
Exemple #4
0
QString AudioOutputPrivate::distanceAudioFile( qreal dest )
{
    if ( dest > 0.0 && dest < 900.0 ) {
        qreal minDistance = 0.0;
        int targetDistance = 0;
        QVector<int> distances;
        distances << 50 << 80 << 100 << 200 << 300 << 400 << 500 << 600 << 700 << 800;
        foreach( int distance, distances ) {
            QString file = audioFile( QString::number( distance ) );
            qreal currentDistance = qAbs( distance - dest );
            if ( !file.isEmpty() && ( minDistance == 0.0 || currentDistance < minDistance ) ) {
                minDistance = currentDistance;
                targetDistance = distance;
            }
        }
Exemple #5
0
AudioBuffer::AudioBuffer(const String& filename)
{
    this->filename = filename;
    alBuffer = 0;
    File audioFile( filename, FILE_READ );
    char text[5];
    text[4] = '\0';
 
    //RIFF
    audioFile.ReadBytes( text, 4 );
    if( String( text ) != "RIFF" ) return;
    audioFile.Seek( audioFile.Pos() + 4 );

    //WAVE
    audioFile.ReadBytes( text, 4 );
    if( String( text ) != "WAVE" ) return;
    
    //FMT
    audioFile.ReadBytes( text, 4 );
    if( String( text ) != "fmt " ) return;
    audioFile.Seek( audioFile.Pos() + 4 ); //skip subChunkSize y audioFormat

    short audioFormat = audioFile.ReadInt16();
    short channels = audioFile.ReadInt16();
    int sampleRate = audioFile.ReadInt();

    audioFile.Seek( audioFile.Pos() + BLOCK_SIZE_TO_SKIP ); // salta hasta ParamsSize o data 

    if( audioFormat != 16 && audioFormat != 1 ) audioFile.Seek( audioFile.ReadInt16() + audioFile.Pos() );
    
    while( ( String( text ) != "data" ) )
    {
        audioFile.ReadBytes( text, 4 );    
        if( String( text ) != "data" )
        {
            audioFile.Seek( audioFile.ReadInt() + audioFile.Pos() );
        }
    }

    int bufferSize = audioFile.ReadInt();
    char* buffer = (char*) malloc( bufferSize );
    audioFile.ReadBytes( buffer, bufferSize );
    alGenBuffers( 1, &alBuffer );
    alBufferData( alBuffer, channels == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16, buffer, bufferSize, sampleRate );

    free( buffer );
}
void FileListModel::addFile(const QString &filePath)
{
	QFileInfo fileInfo(filePath);
	const QString key = MAKE_KEY(fileInfo.canonicalFilePath()); 
	const bool flag = (!m_blockUpdates);

	if(!m_fileStore.contains(key))
	{
		AudioFileModel audioFile(fileInfo.canonicalFilePath());
		audioFile.metaInfo().setTitle(fileInfo.baseName());
		if(flag) beginInsertRows(QModelIndex(), m_fileList.count(), m_fileList.count());
		m_fileStore.insert(key, audioFile);
		m_fileList.append(key);
		if(flag) endInsertRows();
		emit rowAppended();
	}
}
Exemple #7
0
int ACDAudio::run(void* pArg)
{
   Os::Logger::instance().log(FAC_ACD, gACD_DEBUG, "ACDAudio::run - starting get from: %s", mUriString.data());

   HttpMessage *pGetRequest = new HttpMessage;

   pGetRequest->get(mUri, HTTP_GET_TIMEOUT);

   UtlString status;

   pGetRequest->getResponseStatusText(&status);

   if (status == "OK") {
      UtlString audioData;
      ssize_t audioLength;

      const HttpBody* pResponseBody = pGetRequest->getBody();
      pResponseBody->getBytes(&audioData, &audioLength);

      Os::Logger::instance().log(FAC_ACD, gACD_DEBUG, "ACDAudio::run - received %zd bytes from: %s\n",
                    audioLength, mUriString.data());

      // Now save the downloaded audio to a local file
      size_t writeLength;

      OsFile audioFile(mAudioPath);
      if (audioFile.open(OsFile::CREATE) != OS_SUCCESS) {
         Os::Logger::instance().log(FAC_ACD, PRI_ERR, "ACDAudio::run - "
                       "Unable to create audio file: %s", mAudioPath.data());
      }
      else {
         audioFile.write(audioData, audioLength, writeLength);
         audioFile.close();
      }
   }
   else {
      Os::Logger::instance().log(FAC_ACD, PRI_ERR, "ACDAudio::run - failed get from: %s", mUriString.data());
   }

   delete pGetRequest;

   return 0;
}
Exemple #8
0
int main(int argc, char *argv[])
{
    if (argc < 4) {
        std::cout << "not enough arguments" << std::endl;
        return 1;
    }
    
    AudioFile audioFile(argv[1]);
    Synthesizer synth(44100, 10, 16000);
    
    std::cout << "Input file information:\nSamples: " << audioFile.getFrameCount() 
              << "\nSample rate: " << audioFile.getSampleRate()
              << "\nChannels: " << audioFile.getChannelCount() << std::endl;
    
    AudioProcessorPlugin audioProcessor(& synth, argv[3], argc - 4, argv + 4);
    
    SF_INFO outfileInfo = { 0 };
    outfileInfo.samplerate = audioProcessor.getSampleRate();
    outfileInfo.channels = audioProcessor.getChannelCount();
    outfileInfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16;
    SNDFILE * outFile = sf_open(argv[2], SFM_WRITE, & outfileInfo);
    if (outFile == NULL) {
        std::cerr << "Failed to create/open output file '" << argv[2] << "': " << sf_strerror(outFile) << std::endl;
        return 1;
    }
    
    std::vector<float> frameBuffer;
    bool ok = true;
    unsigned int framesRead = audioProcessor.getFrames(frameBuffer);
    while (framesRead > 0) {
        const sf_count_t framesWritten = sf_write_float(outFile, &frameBuffer[0], framesRead);
        if (framesWritten != framesRead) {
            std::cout << "Failed to write frames to output file" << std::endl;
            ok = false;
            break;
        }
        framesRead = audioProcessor.getFrames(frameBuffer);
    }
    
    sf_close(outFile);
    
    return ok ? 0 : 1;
}
void AudioStreamingServer::Serve(const std::shared_ptr<ISocket>& clientSocket)
{
    try {
        
        char recvBuffer[DEFAULT_BUFFER_SIZE];
        int read = clientSocket->Receive(recvBuffer, DEFAULT_BUFFER_SIZE);
        HttpRequest request(recvBuffer, read);

        std::string requestUrl = httpExtractor->ExtractGET(request);
        requestUrl = urlCodec->DecodeURL(requestUrl);

        const char* songsearch = "/songsearch/";
        if(requestUrl.find(songsearch) == 0) {
            
            std::string keyword = requestUrl.substr(strlen(songsearch));
            SendMediaList(clientSocket, keyword, httpExtractor->ExtractHOST(request));

        } else if(audioLibrary->FileExists(requestUrl.substr(1))) {

            std::ifstream audioFile(audioLibrary->GetFullPath(requestUrl), std::ifstream::binary);
            if(audioFile.is_open()) {
                std::string extension = FindExtension(requestUrl);
                std::transform(extension.begin(), extension.end(), extension.begin(), tolower);
                StreamFile(clientSocket, audioFile, EXTENSION_TO_CONTENT_TYPE[extension]);
            } else {
                SendNotFound(clientSocket);
            }

        } else {
            SendNotFound(clientSocket);
        }

    } catch(const GenericAudioStreamerException& e) {
        std::lock_guard<std::mutex> guard(stderrMutex);
        std::cerr << e.what();
    } catch(const IHttpRequestExtractor::HttpExtractionException& e) {
        HttpResponse response(HTTP_1_1, BAD_REQUEST, NONE, 0);
        SendResponseHeader(clientSocket, response);
    }
}
Exemple #10
0
void TrackComponent::mouseDown(const MouseEvent &e) {

	ModifierKeys modifiers = ModifierKeys::getCurrentModifiersRealtime();

    int posX;
	// check the mod keys ..
	if (modifiers.isPopupMenu() || modifiers.isCtrlDown())
	{
		ScopedPointer<PopupMenu> trackMenu_ = new PopupMenu();
		trackMenu_->clear();
		trackMenu_->addCommandItem(&_commands, MainWindow::showMixer);
		trackMenu_->addItem(1, "Add Region", true);
        MouseEvent ev = e.getEventRelativeTo(this);
        for(auto region : _regionComponents)
        {
            posX = ev.x;
            region->setBroughtToFrontOnMouseClick(true);
            if(region->getPositionX() < posX && posX < (region->getPositionX() + region->getRegionWidth()))
            {
                trackMenu_->addItem(2, "Remove Region", true);
            }
        }
        switch (trackMenu_->show())
        {
            case 1:
            {
                FileChooser chooser("Select an audio file to add...",
                                    File::nonexistent,
                                    "*.wav; *aif; *.flac");
                if (chooser.browseForFileToOpen()) {
                    File audioFile(chooser.getResult());
                    const String fileString = audioFile.getFullPathName();
                    String format;
                    if (fileString.contains(".wav"))
                        format = "WAV";
                    else if (fileString.contains(".aif") || fileString.contains(".aiff"))
                        format = "AIFF";
                    else if (fileString.contains(".flac"))
                        format = "FLAC";
                    AudioFormatManager formatManager;
                    formatManager.registerBasicFormats();
                    
                    AudioFormatReader* reader = formatManager.createReaderFor(audioFile);
                    Audio::Region* region = new Audio::SampleRegion(reader, 1, &audioFile);
                    Point<int> position = e.getPosition();
                    int x = position.getX();
                    
                    if (x > _mixerOffset)
                    {
                        int64 samplesRange = secondsToSamples(100, _sampleRate);
                        int64 positionSamples = pixelsToSamples(x - _mixerOffset, 100 * _pixelsPerClip, samplesRange);
                        
                        _track->add(positionSamples, region);
                        createRegionGUI(x, region, formatManager, audioFile);
                        getParentComponent()->resized();
                    }
                    else if (x < _mixerOffset)
                    {
                        _track->add(0, region);
                        createRegionGUI(_mixerOffset, region, formatManager, audioFile);
                        getParentComponent()->resized();
                    }
                }
            }
                break;
            case 2:
            {
                CriticalSection critical;
                critical.enter();
                for(size_t i = 0; i < _regionComponents.size(); ++i)
                {
                    
                    Rectangle<int> bounds_ = _regionComponents.at(i)->getBounds();
					posX = ev.x;
                    if((int)_regionComponents.at(i)->getPositionX() < posX && posX < ((int)_regionComponents.at(i)->getPositionX() + (int)_regionComponents.at(i)->getRegionWidth()))
                    {
                        _track->remove(_regionComponents.at(i)->getRegion(), _posX.at(i));
                        std::vector<RegionComponent*>::iterator regit = _regionComponents.begin() + i;
                        RegionComponent* component = _regionComponents.at(i);
                        removeChildComponent(_regionComponents.at(i));
                        _regionComponents.erase(regit);
                        delete component;
                        _regions.erase(_posX.at(i));
                        std::vector<int64>::iterator posit = _posX.begin() + i;;
                        _posX.erase(posit);
                        std::vector<int64>::iterator sampsit = _sizeSamps.begin() + i;;
                        _sizeSamps.erase(sampsit);
                    }
                }
                critical.exit();
            }
            default:
                break;
        }
    }
}
Exemple #11
0
// for playing a valid audio file given by the slot
// if this function is called by a slot for the first time, audio will be played
// if a slot called this function twice in sequence, the currently played
// audio will be stopped
void Player::play(Slot *givenSlot) {
	QString filepath = givenSlot->getPath();
	QFile audioFile(filepath);

	// in order to stop playback for the audio file given by the
	// same slot after calling this function in sequence DURING playback
	if(givenSlot == lastSlot)
		stop();
	else {

		stop();

		lastSlot = givenSlot;

		// some basic checks:
		// 1. check audio file (*.wav ending AND subsistence)
		if(!filepath.endsWith(".wav", Qt::CaseInsensitive)) {
			// if the given file is not valid, you don't have to call this
			// function twice in order to play a (new set) valid file
			if(lastSlot != NULL)
				lastSlot = NULL;
			throw QString("The given audio file is no *.wav!");
		}

		if(!audioFile.exists())
			throw QString("The given audio file does not exist!");
		// 2. check if format is supported by the audio device
		if(!device.isFormatSupported(format))
			throw QString("Raw audio format not supported by back-end, cannot play audio.");

		// if audio is currently playing - stop it
		stop();

		// prepare audio playback
		player = new QAudioOutput(device, format);
		player->setNotifyInterval(500);
		connect(player, SIGNAL(stateChanged(QAudio::State)), this, SLOT(handleStateChanged(QAudio::State)));
		//connect(player, SIGNAL(notify()), this, SLOT(displayCurrentDuration()));

		// read audio data
		if(audioFile.open(QIODevice::ReadOnly)) {

			// read out wav info
			// ######### IMPLEMENTATION #########

			audioFile.seek(44); // skip wav header
			audioData = audioFile.readAll();
			audioFile.close();

			audioBuffer.setBuffer(&audioData);
			audioBuffer.open(QIODevice::ReadOnly); // prepare/open buffer for playback

			lastSlot->setStatus(SlotStatus::PLAYING);

			// start playback thread
			player->start(&audioBuffer);

			qDebug() << ">> Audio has been started.";
		}

	}

}
bool AudioSourceFilePrelistener::play(const String& absolutePathToAudioFile,
          const int& startPosition_, 
          const int& endPosition_)
{
    DEB("AudioSourceFilePreview::play called.");
    
    // If a new audio file is specified,
    // delete the old bufferingAudioSource and
    // create a new bufferingAudioSource
    if (absolutePathToAudioFile != previouslyUsedPathToAudioFile)
    {
        // delete the old audioFormatReaderSource
        // (exept the first time, when there is no audioFormatReaderSource)
        if (bufferingAudioSource != NULL)
        {
            bufferingAudioSource->releaseResources();
            delete bufferingAudioSource;
        }
        
        // \/ \/ \/ Similar to AudioRegionMixer::addRegion \/ \/ \/
        
        // --- begin{audio file stuff} ---
        File audioFile(absolutePathToAudioFile);
        
        // get a format manager and set it up with the basic types (wav and aiff).
        AudioFormatManager audioFormatManager;
        audioFormatManager.registerBasicFormats();
        // Currently, this registers the WAV and AIFF formats.
        
        AudioFormatReader* audioFormatReader = audioFormatManager.createReaderFor (audioFile);
        // This audioFormatReader will be deleted when the audioFormatReaderSource will
        // be deleted
        // --- end{audio file stuff} ---
        
        // if the previous lines of code weren't successful
        if (audioFormatReader == NULL)
        {
            DEB("AudioSourceFilePrelistener: The audio file couldn't be read.")
            delete audioFormatReader;
            bufferingAudioSource = NULL;
            runPlayback = false;
            return false;
        }
        // Check if this input set is invalid
        if (startPosition_ >= endPosition_
                 || startPosition_ < 0
                 || endPosition_ > audioFormatReader->lengthInSamples)
        {
            DEB("AudioSourceFilePrelistener: Didn't play because the given" 
                "startPosition (" + String(startPosition_) + ") and endPosition ("
                + String(endPosition_) + ") don't make sense.")
            delete audioFormatReader;
            bufferingAudioSource = NULL;
            runPlayback = false;
            return false;
        }
        
        // /\ /\ /\ End of similar to AudioRegionMixer::addRegion /\ /\ /\

        const bool deleteAudioFormatReaderWhenDeleted = true;
        AudioFormatReaderSource* audioFormatReaderSource = new AudioFormatReaderSource (audioFormatReader, deleteAudioFormatReaderWhenDeleted);
        bool deleteSourceWhenDeleted = true;
        bufferingAudioSource = new BufferingAudioSource (audioFormatReaderSource, deleteSourceWhenDeleted, 32768);
        bufferingAudioSource->prepareToPlay(samplesPerBlockExpected, sampleRate);
    }
    else
    // if (absolutePathToAudioFile == previouslyUsedPathToAudioFile)
    {
        // Check if this input set is invalid
        if (startPosition_ >= endPosition
            || startPosition_ < 0
            || endPosition_ > bufferingAudioSource->getTotalLength())
        {
            DEB("AudioSourceFilePrelistener: Didn't play because the given" 
                "startPosition (" + String(startPosition_) + ") and endPosition ("
                + String(endPosition_) + ") don't make sense.")
            runPlayback = false;
            return false;
        }
    }
    
    nextPlayPosition = startPosition_;
    endPosition = endPosition_;
    bufferingAudioSource->setNextReadPosition (nextPlayPosition);
    
    runPlayback = true;
    return true;
}
const AudioFileModel AnalyzeTask::analyzeFile(const QString &filePath, int *type)
{
	*type = fileTypeNormal;
	AudioFileModel audioFile(filePath);

	QFile readTest(filePath);
	if(!readTest.open(QIODevice::ReadOnly))
	{
		*type = fileTypeDenied;
		return audioFile;
	}
	if(checkFile_CDDA(readTest))
	{
		*type = fileTypeCDDA;
		return audioFile;
	}
	readTest.close();

	bool skipNext = false;
	QPair<quint32, quint32> id_val(UINT_MAX, UINT_MAX);
	quint32 coverType = UINT_MAX;
	QByteArray coverData;

	QStringList params;
	params << QString("--Inform=file://%1").arg(QDir::toNativeSeparators(m_templateFile));
	params << QDir::toNativeSeparators(filePath);
	
	QProcess process;
	MUtils::init_process(process, QFileInfo(m_mediaInfoBin).absolutePath());

	process.start(m_mediaInfoBin, params);
		
	if(!process.waitForStarted())
	{
		qWarning("MediaInfo process failed to create!");
		qWarning("Error message: \"%s\"\n", process.errorString().toLatin1().constData());
		process.kill();
		process.waitForFinished(-1);
		return audioFile;
	}

	while(process.state() != QProcess::NotRunning)
	{
		if(*m_abortFlag)
		{
			process.kill();
			qWarning("Process was aborted on user request!");
			break;
		}
		
		if(!process.waitForReadyRead())
		{
			if(process.state() == QProcess::Running)
			{
				qWarning("MediaInfo time out. Killing process and skipping file!");
				process.kill();
				process.waitForFinished(-1);
				return audioFile;
			}
		}

		QByteArray data;

		while(process.canReadLine())
		{
			QString line = QString::fromUtf8(process.readLine().constData()).simplified();
			if(!line.isEmpty())
			{
				//qDebug("Line:%s", MUTILS_UTF8(line));
				
				int index = line.indexOf('=');
				if(index > 0)
				{
					QString key = line.left(index).trimmed();
					QString val = line.mid(index+1).trimmed();
					if(!key.isEmpty())
					{
						updateInfo(audioFile, skipNext, id_val, coverType, coverData, key, val);
					}
				}
			}
		}
	}

	if(audioFile.metaInfo().title().isEmpty())
	{
		QString baseName = QFileInfo(filePath).fileName();
		int index = baseName.lastIndexOf(".");

		if(index >= 0)
		{
			baseName = baseName.left(index);
		}

		baseName = baseName.replace("_", " ").simplified();
		index = baseName.lastIndexOf(" - ");

		if(index >= 0)
		{
			baseName = baseName.mid(index + 3).trimmed();
		}

		audioFile.metaInfo().setTitle(baseName);
	}
	
	process.waitForFinished();
	if(process.state() != QProcess::NotRunning)
	{
		process.kill();
		process.waitForFinished(-1);
	}

	if((coverType != UINT_MAX) && (!coverData.isEmpty()))
	{
		retrieveCover(audioFile, coverType, coverData);
	}

	if((audioFile.techInfo().audioType().compare("PCM", Qt::CaseInsensitive) == 0) && (audioFile.techInfo().audioProfile().compare("Float", Qt::CaseInsensitive) == 0))
	{
		if(audioFile.techInfo().audioBitdepth() == 32) audioFile.techInfo().setAudioBitdepth(AudioFileModel::BITDEPTH_IEEE_FLOAT32);
	}

	return audioFile;
}