diff --git a/cwIoAudioMidiApp.cpp b/cwIoAudioMidiApp.cpp index d299fea..46331bd 100644 --- a/cwIoAudioMidiApp.cpp +++ b/cwIoAudioMidiApp.cpp @@ -35,9 +35,11 @@ namespace cw kMidiThruCheckId, kCurMidiEvtCntId, kTotalMidiEvtCntId, + kMidiMuteCheckId, kCurAudioSecsId, kTotalAudioSecsId, + kAudioMuteCheckId, kSaveBtnId, kOpenBtnId, @@ -66,10 +68,11 @@ namespace cw { kPanelDivId, kMidiThruCheckId, "midiThruCheckId" }, { kPanelDivId, kCurMidiEvtCntId, "curMidiEvtCntId" }, { kPanelDivId, kTotalMidiEvtCntId, "totalMidiEvtCntId" }, + { kPanelDivId, kMidiMuteCheckId, "midiMuteCheckId" }, { kPanelDivId, kCurAudioSecsId, "curAudioSecsId" }, { kPanelDivId, kTotalAudioSecsId, "totalAudioSecsId" }, - + { kPanelDivId, kAudioMuteCheckId, "audioMuteCheckId" }, { kPanelDivId, kSaveBtnId, "saveBtnId" }, { kPanelDivId, kOpenBtnId, "openBtnId" }, @@ -388,6 +391,14 @@ namespace cw cwLogInfo("MIDI thru:%i",m.value->u.b); _set_midi_thru_state(app, m.value->u.b); break; + + case kMidiMuteCheckId: + midi_record_play::set_mute_state(app->mrpH,m.value->u.b); + break; + + case kAudioMuteCheckId: + audio_record_play::set_mute_state(app->arpH,m.value->u.b); + break; case kStartBtnId: _on_ui_start(app); diff --git a/cwIoAudioRecordPlay.cpp b/cwIoAudioRecordPlay.cpp index b696d41..831ddb4 100644 --- a/cwIoAudioRecordPlay.cpp +++ b/cwIoAudioRecordPlay.cpp @@ -39,6 +39,8 @@ namespace cw unsigned curFrameIdx; bool recordFl; bool startedFl; + + bool mute_fl; unsigned* audioInChMapA; unsigned audioInChMapN; @@ -169,8 +171,11 @@ namespace cw for(unsigned chIdx=0; chIdxaudioInChMapA == nullptr ? chIdx : p->audioInChMapA[chIdx]; - - memcpy(a->audioBuf + chIdx*asrc.dspFrameCnt, asrc.iBufArray[ srcChIdx ], asrc.dspFrameCnt * sizeof(sample_t)); + + if( srcChIdx >= asrc.iBufChCnt ) + cwLogError(kInvalidArgRC,"Invalid input channel map index:%i >= %i.",srcChIdx,asrc.iBufChCnt); + else + memcpy(a->audioBuf + chIdx*asrc.dspFrameCnt, asrc.iBufArray[ srcChIdx ], asrc.dspFrameCnt * sizeof(sample_t)); } a->chCnt = chCnt; @@ -197,31 +202,34 @@ namespace cw void _audio_play( audio_record_play_t* p, io::audio_msg_t& adst ) { unsigned adst_idx = 0; - - while(adst_idx < adst.dspFrameCnt) + + if( !p->mute_fl ) { - am_audio_t* a; - unsigned sample_offs = 0; - if((a = _am_audio_from_sample_index(p, p->curFrameIdx, sample_offs )) == nullptr ) - break; - - unsigned n = std::min(a->dspFrameCnt - sample_offs, adst.dspFrameCnt ); - - - // TODO: Verify that this is correct - it looks like sample_offs should have to be incremented - - for(unsigned i=0; ichCnt; ++i) + while(adst_idx < adst.dspFrameCnt) { - unsigned dstChIdx = p->audioOutChMapA != nullptr && i < p->audioOutChMapN ? p->audioOutChMapA[i] : i; + am_audio_t* a; + unsigned sample_offs = 0; + if((a = _am_audio_from_sample_index(p, p->curFrameIdx, sample_offs )) == nullptr ) + break; - if( dstChIdx < adst.oBufChCnt ) - memcpy( adst.oBufArray[ dstChIdx ] + adst_idx, a->audioBuf + sample_offs, n * sizeof(sample_t)); + unsigned n = std::min(a->dspFrameCnt - sample_offs, adst.dspFrameCnt ); + + + // TODO: Verify that this is correct - it looks like sample_offs should have to be incremented + + for(unsigned i=0; ichCnt; ++i) + { + unsigned dstChIdx = p->audioOutChMapA != nullptr && i < p->audioOutChMapN ? p->audioOutChMapA[i] : i; + + if( dstChIdx < adst.oBufChCnt ) + memcpy( adst.oBufArray[ dstChIdx ] + adst_idx, a->audioBuf + sample_offs, n * sizeof(sample_t)); + } + + p->curFrameIdx += n; + adst_idx += n; } - - p->curFrameIdx += n; - adst_idx += n; } - + // TODO: zero unused channels if( adst_idx < adst.dspFrameCnt ) @@ -415,9 +423,16 @@ namespace cw else { if( m.oBufChCnt > 0 ) + { _audio_play(p,m); + } } } + else + { + for(unsigned i=0; imute_fl = true; + return rc; +} + +bool cw::audio_record_play::mute_state( handle_t h ) +{ + rc_t rc = kOkRC; + audio_record_play_t* p = _handleToPtr(h); + return p->mute_fl; + return rc; +} + cw::rc_t cw::audio_record_play::save( handle_t h, const char* fn ) { audio_record_play_t* p = _handleToPtr(h); diff --git a/cwIoAudioRecordPlay.h b/cwIoAudioRecordPlay.h index 13273bb..c701b38 100644 --- a/cwIoAudioRecordPlay.h +++ b/cwIoAudioRecordPlay.h @@ -17,6 +17,8 @@ namespace cw rc_t clear( handle_t h ); rc_t set_record_state( handle_t h, bool record_fl ); bool record_state( handle_t h ); + rc_t set_mute_state( handle_t h, bool mute_fl ); + bool mute_state( handle_t h ); rc_t save( handle_t h, const char* fn ); rc_t open( handle_t h, const char* fn ); double duration_seconds( handle_t h ); diff --git a/cwIoMidiRecordPlay.h b/cwIoMidiRecordPlay.h index d785384..400bb66 100644 --- a/cwIoMidiRecordPlay.h +++ b/cwIoMidiRecordPlay.h @@ -41,6 +41,9 @@ namespace cw rc_t set_record_state( handle_t h, bool record_fl ); bool record_state( handle_t h ); + rc_t set_mute_state( handle_t h, bool record_fl ); + bool mute_state( handle_t h ); + rc_t set_thru_state( handle_t h, bool record_thru ); bool thru_state( handle_t h );