view audio/AudioRecordTarget.cpp @ 482:01669adb0956 tony-2.0-integration

Merge through to branch for Tony 2.0
author Chris Cannam
date Thu, 20 Aug 2015 14:54:21 +0100
parents 1d4cb8befcfd
children 493f2af85497
line wrap: on
line source
/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */

/*
    Sonic Visualiser
    An audio file viewer and annotation editor.
    Centre for Digital Music, Queen Mary, University of London.
    
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
    published by the Free Software Foundation; either version 2 of the
    License, or (at your option) any later version.  See the file
    COPYING included with this distribution for more information.
*/

#include "AudioRecordTarget.h"

#include "base/ViewManagerBase.h"
#include "base/TempDirectory.h"

#include "data/model/WritableWaveFileModel.h"

#include <QDir>

AudioRecordTarget::AudioRecordTarget(ViewManagerBase *manager,
				     QString clientName) :
    m_viewManager(manager),
    m_clientName(clientName.toUtf8().data()),
    m_recording(false),
    m_recordSampleRate(44100),
    m_model(0)
{
}

AudioRecordTarget::~AudioRecordTarget()
{
    QMutexLocker locker(&m_mutex);
}

void
AudioRecordTarget::setSystemRecordBlockSize(int sz)
{
}

void
AudioRecordTarget::setSystemRecordSampleRate(int n)
{
    m_recordSampleRate = n;
}

void
AudioRecordTarget::setSystemRecordLatency(int sz)
{
}

void
AudioRecordTarget::putSamples(int nframes, float **samples)
{
    QMutexLocker locker(&m_mutex); //!!! bad here
    if (!m_recording) return;
    m_model->addSamples(samples, nframes);
}

void
AudioRecordTarget::setInputLevels(float peakLeft, float peakRight)
{
}

void
AudioRecordTarget::modelAboutToBeDeleted()
{
    QMutexLocker locker(&m_mutex);
    if (sender() == m_model) {
        m_model = 0;
        m_recording = false;
    }
}

WritableWaveFileModel *
AudioRecordTarget::startRecording()
{
    {
    QMutexLocker locker(&m_mutex);
    if (m_recording) {
        cerr << "WARNING: AudioRecordTarget::startRecording: We are already recording" << endl;
        return 0;
    }

    m_model = 0;

    QDir parent(TempDirectory::getInstance()->getContainingPath());
    QDir recordedDir;
    QString subdirname = "recorded"; //!!! tr?
    if (!parent.mkpath(subdirname)) {
        cerr << "ERROR: AudioRecordTarget::startRecording: Failed to create recorded dir in \"" << parent.canonicalPath() << "\"" << endl;
        return 0;
    } else {
        recordedDir = parent.filePath(subdirname);
    }

    QDateTime now = QDateTime::currentDateTime();

    // Don't use QDateTime::toString(Qt::ISODate) as the ":" character
    // isn't permitted in filenames on Windows
    QString filename = QString("recorded-%1.wav")
        .arg(now.toString("yyyyMMdd-HHmmss-zzz"));

    m_audioFileName = recordedDir.filePath(filename);

    m_model = new WritableWaveFileModel(m_recordSampleRate, 2, m_audioFileName);

    if (!m_model->isOK()) {
        cerr << "ERROR: AudioRecordTarget::startRecording: Recording failed"
             << endl;
        //!!! and throw?
        delete m_model;
        m_model = 0;
        return 0;
    }

    m_recording = true;
    }

    emit recordStatusChanged(true);
    return m_model;
}

void
AudioRecordTarget::stopRecording()
{
    {
    QMutexLocker locker(&m_mutex);
    if (!m_recording) {
        cerr << "WARNING: AudioRecordTarget::startRecording: Not recording" << endl;
        return;
    }

    m_model->setCompletion(100);
    m_model = 0;
    m_recording = false;
    }

    emit recordStatusChanged(false);
}