Mercurial > hg > svapp
changeset 476:f4d1fa41b94b recording
Basic recording stuff
author | Chris Cannam |
---|---|
date | Tue, 18 Aug 2015 15:00:34 +0100 |
parents | f93820d36cb0 |
children | 411e019474e5 |
files | audio/AudioRecordTarget.cpp audio/AudioRecordTarget.h |
diffstat | 2 files changed, 193 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/audio/AudioRecordTarget.cpp Tue Aug 18 15:00:34 2015 +0100 @@ -0,0 +1,126 @@ +/* -*- 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/fileio/WavFileWriter.h" + +#include <QDir> + +AudioRecordTarget::AudioRecordTarget(ViewManagerBase *manager, + QString clientName) : + m_viewManager(manager), + m_clientName(clientName.toUtf8().data()), + m_recording(false), + m_recordSampleRate(44100), + m_writer(0) +{ +} + +AudioRecordTarget::~AudioRecordTarget() +{ + QMutexLocker locker(&m_mutex); + delete m_writer; +} + +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_writer->writeSamples(samples, nframes); +} + +void +AudioRecordTarget::setInputLevels(float peakLeft, float peakRight) +{ +} + +QString +AudioRecordTarget::startRecording() +{ + QMutexLocker locker(&m_mutex); + if (m_recording) { + cerr << "WARNING: AudioRecordTarget::startRecording: We are already recording" << endl; + return ""; + } + + 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 ""; + } else { + recordedDir = parent.filePath(subdirname); + } + + //!!! todo proper temp name as in TempDirectory + + QString filename = "recorded.wav"; //!!! + + m_audioFileName = recordedDir.filePath(filename); + + m_writer = new WavFileWriter(m_audioFileName, + m_recordSampleRate, + 2, + WavFileWriter::WriteToTarget); + + if (!m_writer->isOK()) { + cerr << "ERROR: AudioRecordTarget::startRecording: Recording failed: " + << m_writer->getError() << endl; + //!!! and throw? + delete m_writer; + return ""; + } + + m_recording = true; + + return m_audioFileName; +} + +void +AudioRecordTarget::stopRecording() +{ + QMutexLocker locker(&m_mutex); + if (!m_recording) { + cerr << "WARNING: AudioRecordTarget::startRecording: Not recording" << endl; + return; + } + + m_writer->close(); + delete m_writer; + m_recording = false; +} + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/audio/AudioRecordTarget.h Tue Aug 18 15:00:34 2015 +0100 @@ -0,0 +1,67 @@ +/* -*- 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. +*/ + +#ifndef AUDIO_RECORD_TARGET_H +#define AUDIO_RECORD_TARGET_H + +#include <bqaudioio/ApplicationRecordTarget.h> + +#include <string> + +#include <QObject> +#include <QMutex> + +#include "base/BaseTypes.h" + +class ViewManagerBase; +class WavFileWriter; + +class AudioRecordTarget : public QObject, + public breakfastquay::ApplicationRecordTarget +{ + Q_OBJECT + +public: + AudioRecordTarget(ViewManagerBase *, QString clientName); + virtual ~AudioRecordTarget(); + + virtual std::string getClientName() const { return m_clientName; } + + virtual int getApplicationSampleRate() const { return 0; } // don't care + virtual int getApplicationChannelCount() const { return 2; } + + virtual void setSystemRecordBlockSize(int); + virtual void setSystemRecordSampleRate(int); + virtual void setSystemRecordLatency(int); + + virtual void putSamples(int nframes, float **samples); + + virtual void setInputLevels(float peakLeft, float peakRight); + + virtual void audioProcessingOverload() { } + + QString startRecording(); // and return the audio filename + void stopRecording(); + +private: + ViewManagerBase *m_viewManager; + std::string m_clientName; + bool m_recording; + sv_samplerate_t m_recordSampleRate; + QString m_audioFileName; + WavFileWriter *m_writer; + QMutex m_mutex; +}; + +#endif