diff --git a/src/util/audio/AudioQueue.cpp b/src/util/audio/AudioQueue.cpp index 8a456e09..60a28a9b 100644 --- a/src/util/audio/AudioQueue.cpp +++ b/src/util/audio/AudioQueue.cpp @@ -36,7 +36,7 @@ unsigned long AudioQueue::size() return deque::size(); } -void AudioQueue::push(int *samples, unsigned long nSamples) +void AudioQueue::push(int* samples, unsigned long nSamples) { XOJ_CHECK_TYPE(AudioQueue); @@ -66,13 +66,17 @@ std::vector AudioQueue::pop(unsigned long nSamples) void AudioQueue::signalEndOfStream() { + XOJ_CHECK_TYPE(AudioQueue); + this->streamEnd = true; this->notified = true; this->lockCondition.notify_one(); } -void AudioQueue::waitForNewElements(std::unique_lock &lock) +void AudioQueue::waitForNewElements(std::unique_lock& lock) { + XOJ_CHECK_TYPE(AudioQueue); + while (!this->notified) { this->lockCondition.wait(lock); @@ -81,10 +85,14 @@ void AudioQueue::waitForNewElements(std::unique_lock &lock) bool AudioQueue::hasStreamEnded() { + XOJ_CHECK_TYPE(AudioQueue); + return this->streamEnd; } std::mutex &AudioQueue::syncMutex() { + XOJ_CHECK_TYPE(AudioQueue); + return this->queueLock; } diff --git a/src/util/audio/AudioQueue.h b/src/util/audio/AudioQueue.h index f62fdda9..788e055a 100644 --- a/src/util/audio/AudioQueue.h +++ b/src/util/audio/AudioQueue.h @@ -24,23 +24,26 @@ public: AudioQueue(); ~AudioQueue(); +public: void reset(); bool empty(); unsigned long size(); - void push(int *samples, unsigned long nSamples); + void push(int* samples, unsigned long nSamples); std::vector pop(unsigned long nSamples); void signalEndOfStream(); - void waitForNewElements(std::unique_lock &lock); + void waitForNewElements(std::unique_lock& lock); bool hasStreamEnded(); std::mutex &syncMutex(); +private: + XOJ_TYPE_ATTRIB; + protected: std::mutex queueLock; std::condition_variable lockCondition; bool streamEnd = false; bool notified = false; - XOJ_TYPE_ATTRIB; }; diff --git a/src/util/audio/AudioRecorder.cpp b/src/util/audio/AudioRecorder.cpp index bd571973..9046a3b5 100644 --- a/src/util/audio/AudioRecorder.cpp +++ b/src/util/audio/AudioRecorder.cpp @@ -2,7 +2,8 @@ #include "AudioRecorder.h" -AudioRecorder::AudioRecorder(Settings *settings) : settings(settings) +AudioRecorder::AudioRecorder(Settings* settings) + : settings(settings) { XOJ_INIT_TYPE(AudioRecorder); @@ -51,4 +52,4 @@ void AudioRecorder::stop() // Reset the queue for the next recording this->audioQueue->reset(); -} \ No newline at end of file +} diff --git a/src/util/audio/AudioRecorder.h b/src/util/audio/AudioRecorder.h index 4d6b71e2..5534b33d 100644 --- a/src/util/audio/AudioRecorder.h +++ b/src/util/audio/AudioRecorder.h @@ -22,20 +22,22 @@ class AudioRecorder { public: - explicit AudioRecorder(Settings *settings); + explicit AudioRecorder(Settings* settings); ~AudioRecorder(); + +public: void start(std::string filename); void stop(); +private: + XOJ_TYPE_ATTRIB; + protected: Settings* settings; - AudioQueue *audioQueue; - PortAudioProducer *portAudioProducer; - SoxConsumer *soxConsumer; - -private: - XOJ_TYPE_ATTRIB; + AudioQueue* audioQueue; + PortAudioProducer* portAudioProducer; + SoxConsumer* soxConsumer; }; diff --git a/src/util/audio/PortAudioProducer.cpp b/src/util/audio/PortAudioProducer.cpp index e5d73d55..1d378fe0 100644 --- a/src/util/audio/PortAudioProducer.cpp +++ b/src/util/audio/PortAudioProducer.cpp @@ -38,10 +38,11 @@ std::list PortAudioProducer::getInputDevices() const DeviceInfo PortAudioProducer::getSelectedInputDevice() { + XOJ_CHECK_TYPE(PortAudioProducer); + return DeviceInfo(&sys.deviceByIndex(this->selectedInputDevice), true); } - void PortAudioProducer::setInputDevice(DeviceInfo deviceInfo) { XOJ_CHECK_TYPE(PortAudioProducer); @@ -80,7 +81,7 @@ void PortAudioProducer::startRecording() this->inputStream->start(); } -int PortAudioProducer::recordCallback(const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo *timeInfo, +int PortAudioProducer::recordCallback(const void* inputBuffer, void* outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags statusFlags) { XOJ_CHECK_TYPE(PortAudioProducer); @@ -117,4 +118,4 @@ void PortAudioProducer::stopRecording() // Allow new recording by removing the old one delete this->inputStream; this->inputStream = nullptr; -} \ No newline at end of file +} diff --git a/src/util/audio/PortAudioProducer.h b/src/util/audio/PortAudioProducer.h index 39a8833e..a0dff096 100644 --- a/src/util/audio/PortAudioProducer.h +++ b/src/util/audio/PortAudioProducer.h @@ -26,37 +26,33 @@ class PortAudioProducer { public: explicit PortAudioProducer(Settings *settings, AudioQueue *audioQueue); - ~PortAudioProducer(); +public: std::list getInputDevices(); - const DeviceInfo getSelectedInputDevice(); - void setInputDevice(DeviceInfo deviceInfo); - bool isRecording(); - void startRecording(); + int recordCallback(const void* inputBuffer, void* outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags statusFlags); + void stopRecording(); - int recordCallback(const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo * timeInfo, PaStreamCallbackFlags statusFlags); +private: + XOJ_TYPE_ATTRIB; - void stopRecording(); protected: double sampleRate = 44100.0; const unsigned long framesPerBuffer = 64; portaudio::AutoSystem autoSys; - portaudio::System &sys; - Settings *settings; - AudioQueue *audioQueue; + portaudio::System& sys; + Settings* settings; + AudioQueue* audioQueue; - PaDeviceIndex selectedInputDevice; - unsigned int inputChannels; + PaDeviceIndex selectedInputDevice = 0; + unsigned int inputChannels = 0; - portaudio::MemFunCallbackStream *inputStream = nullptr; -private: - XOJ_TYPE_ATTRIB; + portaudio::MemFunCallbackStream* inputStream = nullptr; }; diff --git a/src/util/audio/SoxConsumer.cpp b/src/util/audio/SoxConsumer.cpp index 37a3db64..76d20530 100644 --- a/src/util/audio/SoxConsumer.cpp +++ b/src/util/audio/SoxConsumer.cpp @@ -1,6 +1,7 @@ #include "SoxConsumer.h" -SoxConsumer::SoxConsumer(AudioQueue *audioQueue) : audioQueue(audioQueue) +SoxConsumer::SoxConsumer(AudioQueue* audioQueue) + : audioQueue(audioQueue) { XOJ_INIT_TYPE(SoxConsumer); @@ -18,11 +19,11 @@ SoxConsumer::~SoxConsumer() XOJ_RELEASE_TYPE(SoxConsumer); } -void SoxConsumer::start(std::string filename, double sampleRate, const DeviceInfo &inputDevice) +void SoxConsumer::start(std::string filename, double sampleRate, const DeviceInfo& inputDevice) { XOJ_CHECK_TYPE(SoxConsumer); - this->inputSignal = new sox_signalinfo_t; + this->inputSignal = new sox_signalinfo_t(); this->inputSignal->rate = sampleRate; this->inputSignal->length = SOX_UNSPEC; this->inputSignal->channels = (unsigned int) inputDevice.getInputChannels(); @@ -46,7 +47,7 @@ void SoxConsumer::start(std::string filename, double sampleRate, const DeviceInf while (!audioQueue->empty()) { - std::vector tmpBuffer = audioQueue->pop(64ul * this->inputSignal->channels); + std::vector tmpBuffer = audioQueue->pop(64ul * this->inputSignal->channels); if (!tmpBuffer.empty()) { @@ -56,7 +57,6 @@ void SoxConsumer::start(std::string filename, double sampleRate, const DeviceInf } sox_close(this->outputFile); - }); } @@ -84,5 +84,4 @@ void SoxConsumer::stop() { this->consumerThread->join(); } - } diff --git a/src/util/audio/SoxConsumer.h b/src/util/audio/SoxConsumer.h index 94b8b40c..37c267fe 100644 --- a/src/util/audio/SoxConsumer.h +++ b/src/util/audio/SoxConsumer.h @@ -27,20 +27,22 @@ class SoxConsumer public: explicit SoxConsumer(AudioQueue *audioQueue); ~SoxConsumer(); - void start(std::string filename, double sampleRate, const DeviceInfo &inputDevice); + +public: + void start(std::string filename, double sampleRate, const DeviceInfo& inputDevice); void join(); void stop(); -protected:protected: - sox_signalinfo_t *inputSignal = nullptr; - sox_format_t *outputFile = nullptr; - bool stopConsumer = false; - - AudioQueue *audioQueue; - std::thread *consumerThread; - private: XOJ_TYPE_ATTRIB; + +protected: + sox_signalinfo_t* inputSignal = nullptr; + sox_format_t* outputFile = nullptr; + bool stopConsumer = false; + + AudioQueue* audioQueue; + std::thread* consumerThread = nullptr; };