From cb8490996375675872a419928fa36427a9f29a7f Mon Sep 17 00:00:00 2001 From: SeeLook <seelook@gmail.com> Date: Fri, 12 Aug 2016 14:55:30 +0200 Subject: [PATCH] Inline callbacks (too big) moved to implementation, Adjusted input callback to new TpitchFinder --- src/libs/sound/trtaudio.cpp | 35 +++++++++++++++++++++++++++++++ src/libs/sound/trtaudio.h | 39 +++++------------------------------ src/libs/sound/trtaudioin.cpp | 29 +++++++++++++++++++------- src/libs/sound/trtaudioin.h | 16 ++------------ 4 files changed, 64 insertions(+), 55 deletions(-) diff --git a/src/libs/sound/trtaudio.cpp b/src/libs/sound/trtaudio.cpp index 1757b3f1e..b84b94a4e 100755 --- a/src/libs/sound/trtaudio.cpp +++ b/src/libs/sound/trtaudio.cpp @@ -594,9 +594,44 @@ void TrtAudio::restartASIO() { } #endif +//################################################################################################# +//################### PRIVATE ############################################ +//################################################################################################# +int TrtAudio::duplexCallBack(void* outBuffer, void* inBuffer, unsigned int nBufferFrames, double, RtAudioStreamStatus status, void*) { + if (m_cbOut) { + if (m_cbOut(outBuffer, nBufferFrames, status)) + if (m_cbIn) + m_cbIn(inBuffer, nBufferFrames, status); + } else + if (m_cbIn) + m_cbIn(inBuffer, nBufferFrames, status); + return 0; +} +int TrtAudio::passInputCallBack(void* outBuffer, void* inBuffer, unsigned int nBufferFrames, double, RtAudioStreamStatus status, void*) { + qint16 *in = (qint16*)inBuffer; + qint16 *out = (qint16*)outBuffer; + if (m_cbOut(outBuffer, nBufferFrames, status)) // none playing is performed + for (int i = 0; i < nBufferFrames; i++) { // then forward input + *out++ = *(in + i); // left channel + *out++ = *(in + i); // right channel + } + m_cbIn(inBuffer, nBufferFrames, status); + return 0; +} +int TrtAudio::playCallBack(void* outBuffer, void*, unsigned int nBufferFrames, double, RtAudioStreamStatus status, void*) { + if (m_cbOut(outBuffer, nBufferFrames, status)) + ao()->emitPlayingFinished(); + return 0; +} + + +int TrtAudio::listenCallBack(void*, void* inBuffer, unsigned int nBufferFrames, double, RtAudioStreamStatus status, void*) { + m_cbIn(inBuffer, nBufferFrames, status); + return 0; +} diff --git a/src/libs/sound/trtaudio.h b/src/libs/sound/trtaudio.h index 68484a11e..b5cc98769 100755 --- a/src/libs/sound/trtaudio.h +++ b/src/libs/sound/trtaudio.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2013-2015 by Tomasz Bojczuk * + * Copyright (C) 2013-2016 by Tomasz Bojczuk * * tomaszbojczuk@gmail.com * * * * This program is free software; you can redistribute it and/or modify * @@ -159,39 +159,10 @@ protected: #endif private: - static int duplexCallBack(void *outBuffer, void *inBuffer, unsigned int nBufferFrames, double, RtAudioStreamStatus status, void*) { - if (m_cbOut) { - if (m_cbOut(outBuffer, nBufferFrames, status)) - if (m_cbIn) - m_cbIn(inBuffer, nBufferFrames, status); - } else - if (m_cbIn) - m_cbIn(inBuffer, nBufferFrames, status); - return 0; - } - - static int passInputCallBack(void *outBuffer, void *inBuffer, unsigned int nBufferFrames, double, RtAudioStreamStatus status, void*) { - qint16 *in = (qint16*)inBuffer; - qint16 *out = (qint16*)outBuffer; - if (m_cbOut(outBuffer, nBufferFrames, status)) // none playing is performed - for (int i = 0; i < nBufferFrames; i++) { // then forward input - *out++ = *(in + i); // left channel - *out++ = *(in + i); // right channel - } - m_cbIn(inBuffer, nBufferFrames, status); - return 0; - } - - static int playCallBack(void *outBuffer, void*, unsigned int nBufferFrames, double, RtAudioStreamStatus status, void*) { - if (m_cbOut(outBuffer, nBufferFrames, status)) - ao()->emitPlayingFinished(); - return 0; - } - - static int listenCallBack(void*, void *inBuffer, unsigned int nBufferFrames, double, RtAudioStreamStatus status, void*) { - m_cbIn(inBuffer, nBufferFrames, status); - return 0; - } + static int duplexCallBack(void *outBuffer, void *inBuffer, unsigned int nBufferFrames, double, RtAudioStreamStatus status, void*); + static int passInputCallBack(void *outBuffer, void *inBuffer, unsigned int nBufferFrames, double, RtAudioStreamStatus status, void*); + static int playCallBack(void *outBuffer, void*, unsigned int nBufferFrames, double, RtAudioStreamStatus status, void*); + static int listenCallBack(void*, void *inBuffer, unsigned int nBufferFrames, double, RtAudioStreamStatus status, void*); private: TaudioParams *m_audioParams; diff --git a/src/libs/sound/trtaudioin.cpp b/src/libs/sound/trtaudioin.cpp index bb27a97da..1601e7d3f 100755 --- a/src/libs/sound/trtaudioin.cpp +++ b/src/libs/sound/trtaudioin.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2011-2015 by Tomasz Bojczuk * + * Copyright (C) 2011-2016 by Tomasz Bojczuk * * tomaszbojczuk@gmail.com * * * * This program is free software; you can redistribute it and/or modify * @@ -59,11 +59,11 @@ TaudioIN::TaudioIN(TaudioParams* params, QObject* parent) : TrtAudio(params, e_input, inCallBack), m_pitch(0), m_volume(0.0), - m_state(e_stopped), m_stoppedByUser(false), m_loPitch(15), m_hiPitch(140), m_noteWasStarted(false), - m_currentRange(1) + m_currentRange(1), + m_state(e_stopped) { if (m_instance) { qDebug() << "Nothing of this kind... TaudioIN already exist!"; @@ -85,10 +85,12 @@ TaudioIN::TaudioIN(TaudioParams* params, QObject* parent) : TaudioIN::~TaudioIN() { + stopListening(); m_goingDelete = true; closeStream(); m_pitch->blockSignals(true); - m_pitch->deleteLater(); +// m_pitch->deleteLater(); + delete m_pitch; m_instance = 0; deleteInParams(); resetCallBack(); @@ -187,7 +189,7 @@ void TaudioIN::startListening() { openStream(); if (startStream()) setState(e_listening); -// qDebug() << "start listening"; + qDebug() << "start listening"; } } } @@ -195,13 +197,13 @@ void TaudioIN::startListening() { void TaudioIN::stopListening() { if (state() != e_stopped) { -// qDebug() << "stop listening"; + qDebug() << "stop listening"; m_volume = 0.0; m_LastChunkPitch = 0.0; if (areStreamsSplit() || rtDevice()->getCurrentApi() != RtAudio::LINUX_PULSE) abortStream(); setState(e_stopped); - m_pitch->resetFinder(); + m_pitch->stop(true); } } @@ -240,6 +242,19 @@ void TaudioIN::noteFinishedSlot(TnoteStruct* lastNote) { m_lastNote.set(); // reset last detected note structure } +//################################################################################################# +//################### PROTECTED ############################################ +//################################################################################################# +bool TaudioIN::inCallBack(void* inBuff, unsigned int nBufferFrames, const RtAudioStreamStatus& st) { + if (m_goingDelete || instance()->isStoped()) + return true; + if (st) + qDebug() << "input buffer underflow"; + + instance()->m_pitch->copyToBuffer(inBuff, nBufferFrames); + return false; +} + //################################################################################################# //################### PRIVATE SLOTS ############################################ //################################################################################################# diff --git a/src/libs/sound/trtaudioin.h b/src/libs/sound/trtaudioin.h index 87d5c00ff..cbac576fd 100755 --- a/src/libs/sound/trtaudioin.h +++ b/src/libs/sound/trtaudioin.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2011-2015 by Tomasz Bojczuk * + * Copyright (C) 2011-2016 by Tomasz Bojczuk * * tomaszbojczuk@gmail.com * * * * This program is free software; you can redistribute it and/or modify * @@ -129,19 +129,7 @@ public slots: void stopListening(); protected: - static bool inCallBack(void* inBuff, unsigned int nBufferFrames, const RtAudioStreamStatus& st) { - if (m_goingDelete || instance()->isStoped()) - return true; - if (st) - qDebug() << "input buffer underflow"; - qint16 *in = (qint16*)inBuff; - qint16 value; - for (int i = 0; i < nBufferFrames; i++) { - value = *(in + i); - instance()->m_pitch->fillBuffer(float(double(value) / 32760.0f)); - } - return false; - } + static bool inCallBack(void* inBuff, unsigned int nBufferFrames, const RtAudioStreamStatus& st); private slots: -- GitLab