annotate audio/AudioCallbackRecordTarget.h @ 575:c2e27ad7f408 3.0-integration

Pull out record buffer into a separate RT-ish thread
author Chris Cannam
date Wed, 04 Jan 2017 16:53:06 +0000
parents b3c35447ef31
children 298d864113f0
rev   line source
Chris@476 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@476 2
Chris@476 3 /*
Chris@476 4 Sonic Visualiser
Chris@476 5 An audio file viewer and annotation editor.
Chris@476 6 Centre for Digital Music, Queen Mary, University of London.
Chris@476 7
Chris@476 8 This program is free software; you can redistribute it and/or
Chris@476 9 modify it under the terms of the GNU General Public License as
Chris@476 10 published by the Free Software Foundation; either version 2 of the
Chris@476 11 License, or (at your option) any later version. See the file
Chris@476 12 COPYING included with this distribution for more information.
Chris@476 13 */
Chris@476 14
Chris@574 15 #ifndef SV_AUDIO_CALLBACK_RECORD_TARGET_H
Chris@574 16 #define SV_AUDIO_CALLBACK_RECORD_TARGET_H
Chris@574 17
Chris@574 18 #include "base/AudioRecordTarget.h"
Chris@476 19
Chris@476 20 #include <bqaudioio/ApplicationRecordTarget.h>
Chris@476 21
Chris@476 22 #include <string>
Chris@575 23 #include <atomic>
Chris@476 24
Chris@476 25 #include <QObject>
Chris@476 26 #include <QMutex>
Chris@476 27
Chris@476 28 #include "base/BaseTypes.h"
Chris@575 29 #include "base/RingBuffer.h"
Chris@476 30
Chris@476 31 class ViewManagerBase;
Chris@477 32 class WritableWaveFileModel;
Chris@476 33
Chris@574 34 class AudioCallbackRecordTarget : public QObject,
Chris@574 35 public AudioRecordTarget,
Chris@574 36 public breakfastquay::ApplicationRecordTarget
Chris@476 37 {
Chris@476 38 Q_OBJECT
Chris@476 39
Chris@476 40 public:
Chris@574 41 AudioCallbackRecordTarget(ViewManagerBase *, QString clientName);
Chris@574 42 virtual ~AudioCallbackRecordTarget();
Chris@476 43
Chris@559 44 virtual std::string getClientName() const override { return m_clientName; }
Chris@476 45
Chris@559 46 virtual int getApplicationSampleRate() const override;
Chris@559 47 virtual int getApplicationChannelCount() const override;
Chris@476 48
Chris@559 49 virtual void setSystemRecordBlockSize(int) override;
Chris@559 50 virtual void setSystemRecordSampleRate(int) override;
Chris@559 51 virtual void setSystemRecordLatency(int) override;
Chris@559 52 virtual void setSystemRecordChannelCount(int) override;
Chris@476 53
Chris@559 54 virtual void putSamples(const float *const *samples, int nchannels, int nframes) override;
Chris@476 55
Chris@559 56 virtual void setInputLevels(float peakLeft, float peakRight) override;
Chris@476 57
Chris@559 58 virtual void audioProcessingOverload() override { }
Chris@476 59
Chris@508 60 QString getRecordContainerFolder();
Chris@483 61 QString getRecordFolder();
Chris@483 62
Chris@574 63 virtual bool isRecording() const override { return m_recording; }
Chris@574 64 virtual sv_frame_t getRecordDuration() const override { return m_frameCount; }
Chris@574 65
Chris@574 66 virtual bool getInputLevels(float &left, float &right) override;
Chris@574 67
Chris@574 68 WritableWaveFileModel *startRecording(); // caller takes ownership of model
Chris@476 69 void stopRecording();
Chris@477 70
Chris@477 71 signals:
Chris@477 72 void recordStatusChanged(bool recording);
Chris@485 73 void recordDurationChanged(sv_frame_t, sv_samplerate_t); // emitted occasionally
Chris@497 74 void recordCompleted();
Chris@477 75
Chris@477 76 protected slots:
Chris@477 77 void modelAboutToBeDeleted();
Chris@575 78 void updateModel();
Chris@476 79
Chris@476 80 private:
Chris@476 81 ViewManagerBase *m_viewManager;
Chris@476 82 std::string m_clientName;
Chris@575 83 std::atomic_bool m_recording;
Chris@476 84 sv_samplerate_t m_recordSampleRate;
Chris@546 85 int m_recordChannelCount;
Chris@485 86 sv_frame_t m_frameCount;
Chris@476 87 QString m_audioFileName;
Chris@477 88 WritableWaveFileModel *m_model;
Chris@575 89 RingBuffer<float> **m_buffers;
Chris@575 90 QMutex m_bufPtrMutex;
Chris@575 91 int m_bufferCount;
Chris@574 92 float m_inputLeft;
Chris@574 93 float m_inputRight;
Chris@575 94
Chris@575 95 void recreateBuffers();
Chris@476 96 };
Chris@476 97
Chris@476 98 #endif