Experimental real-time audio and signal processing application development framework.
Go to file
2023-02-20 15:26:07 -05:00
dns_sd Changes to support autotools build. 2020-03-24 08:51:51 -04:00
html cwIoAudioMidiApp.cpp,html/audio_midi/ui.cfg : Updates to support current version of IO. 2023-02-14 20:59:06 -05:00
study cwDataSet.h/cpp, cwNN.h/cpp : Updates. 2020-10-30 09:40:39 -04:00
.gitignore .gitignore : updates 2020-03-23 10:51:18 -04:00
cwAudioBuf.cpp cwAudioBuf.h/cpp : Added version of meter() which returns an array of meter values from a device. 2021-01-31 11:04:11 -05:00
cwAudioBuf.h cwAudioBuf.h : Updated comments. 2023-02-14 20:57:26 -05:00
cwAudioBufDecls.h Added 'decls' include files to hold public declarations for audio,midi,serial,socket, and websock modules. 2020-03-23 10:41:28 -04:00
cwAudioDevice.cpp cwAudioDevice*.h,cpp, cwIo.h,cpp, cwIoAudioPanel.cpp : Added deviceEnable(), deviceSeek() to audio device driver. 2023-02-19 14:16:37 -05:00
cwAudioDevice.h cwAudioDevice*.h,cpp, cwIo.h,cpp, cwIoAudioPanel.cpp : Added deviceEnable(), deviceSeek() to audio device driver. 2023-02-19 14:16:37 -05:00
cwAudioDeviceAlsa.cpp cwAudioDevice*.h,cpp, cwIo.h,cpp, cwIoAudioPanel.cpp : Added deviceEnable(), deviceSeek() to audio device driver. 2023-02-19 14:16:37 -05:00
cwAudioDeviceAlsa.h cwAudioDevice*.h,cpp, cwIo.h,cpp, cwIoAudioPanel.cpp : Added deviceEnable(), deviceSeek() to audio device driver. 2023-02-19 14:16:37 -05:00
cwAudioDeviceDecls.h Added 'decls' include files to hold public declarations for audio,midi,serial,socket, and websock modules. 2020-03-23 10:41:28 -04:00
cwAudioDeviceFile.cpp cwAudioDevice*.h,cpp, cwIo.h,cpp, cwIoAudioPanel.cpp : Added deviceEnable(), deviceSeek() to audio device driver. 2023-02-19 14:16:37 -05:00
cwAudioDeviceFile.h cwAudioDevice*.h,cpp, cwIo.h,cpp, cwIoAudioPanel.cpp : Added deviceEnable(), deviceSeek() to audio device driver. 2023-02-19 14:16:37 -05:00
cwAudioDeviceTest.cpp cwAudioDeviceTest.cpp : Change static_cast<> to reinterpet_cast<> 2021-01-20 13:06:57 -05:00
cwAudioDeviceTest.h cwAudioDeviceTest.h/cpp : test() now takes a cfg object and added test_tone(). 2020-12-15 15:30:45 -05:00
cwAudioFile.cpp cwAudioFile.h/cpp : Filenames are now automatically expanded. Comments added. 2023-02-18 13:48:11 -05:00
cwAudioFile.h cwAudioFile.h/cpp : Filenames are now automatically expanded. Comments added. 2023-02-18 13:48:11 -05:00
cwAudioFileOps.cpp cwAudioFileProc.h/cpp, cwAudioTransforms.h/cpp, cwPvAudioFileProc.h/cpp: Initial commit. 2021-08-15 16:06:29 -04:00
cwAudioFileOps.h cwFileOps.h/cpp: Added fade in/out fucnctionality to selectToFile(). 2021-02-24 13:21:35 -05:00
cwAudioFileProc.cpp Allow frequency domain transforms to have a variable window sample count. 2022-12-27 18:09:31 -05:00
cwAudioFileProc.h cwAudioFileProc.h/cpp, cwAudioTransforms.h/cpp, cwPvAudioFileProc.h/cpp: Initial commit. 2021-08-15 16:06:29 -04:00
cwAudioTransforms.cpp Introduced fd_real_t to allow fbuf_t internal data vectors to be type double. 2023-01-05 07:24:07 -05:00
cwAudioTransforms.h cwAudioTransforms.h:Call basic mode w/ knee. 2023-01-08 14:18:11 -05:00
cwAvahiSurface.cpp Updated dns_sd/ to match the Arduino build. 2020-02-13 11:29:52 -05:00
cwCmInterface.cpp cwCmInterface.h/cpp, cwScoreFollower.h/cpp, Makefile.am : Initial score_follow development 2023-01-30 19:38:11 -05:00
cwCmInterface.h cwCmInterface.h/cpp, cwScoreFollower.h/cpp, Makefile.am : Initial score_follow development 2023-01-30 19:38:11 -05:00
cwCommon.h cwIoAudioMidiApp.cpp,cwIoMidiRecordPlay.h/cpp : Upgrades to cwIoAudioMidiApp. 2022-10-15 15:07:06 -04:00
cwCommonImpl.cpp Initial commit 2019-12-18 22:24:12 -05:00
cwCommonImpl.h cwCommonImpl.h : Update comments. 2023-02-18 13:48:38 -05:00
cwDataSets.cpp cwDataSets.h/cpp : Add use of cache_t file cache to rdr to improve file read performance and add shuffling option. 2020-12-29 11:22:29 -05:00
cwDataSets.h cwDataSets.h/cpp : Add use of cache_t file cache to rdr to improve file read performance and add shuffling option. 2020-12-29 11:22:29 -05:00
cwDnsSd.cpp cwTime.h/cpp,cwDnsSd.cpp,cwMdns.cpp : Changed cwTime interface to use all references rather than pointers as arguments. 2020-04-17 11:16:21 -04:00
cwDnsSd.h cwUtility, cwDnsSd, cwEuCon : Initial commit. 2020-02-12 13:43:00 -05:00
cwDsp.cpp Updates in preparation for variable length FT windows. 2022-12-05 17:19:58 -05:00
cwDsp.h cwDsp.h: Initial implementation of ampl_to_db() and db_to_ampl() 2023-01-08 14:17:15 -05:00
cwDspTransforms.cpp Added audio_meter and cwIo and flow support for metering. 2023-01-05 07:30:57 -05:00
cwDspTransforms.h Added audio_meter and cwIo and flow support for metering. 2023-01-05 07:30:57 -05:00
cwDspTypes.h cwDspType.h : Set fd_real_t to float. 2023-01-08 14:12:45 -05:00
cwEuCon.cpp cwEuCon.cpp : Change mute id's to indicate source. 2020-05-19 20:51:20 -04:00
cwEuCon.h cwEuCon.h/cpp : Implemented sendMsg() and use cwEuConDecls.h. 2020-05-14 11:13:07 -04:00
cwEuConDecls.h cwEuConDecls.h : Changed kMuteEuconId to kEucMuteEuconId and added kFdrMuteEuconId. 2020-05-19 20:44:35 -04:00
cwFFT.cpp Makefile.am,cwDsp,cwFFT: Updates to make FFTW optional. 2020-10-11 17:18:58 -04:00
cwFFT.h Makefile.am,cwDsp,cwFFT: Updates to make FFTW optional. 2020-10-11 17:18:58 -04:00
cwFile.cpp cwFile.h/cpp : backup() now takes an optional destination directory. 2022-12-17 08:14:40 -05:00
cwFile.h cwFile.h/cpp : backup() now takes an optional destination directory. 2022-12-17 08:14:40 -05:00
cwFileSys.cpp cwFileSys.cpp : vMakeVersionedFn() now has better error reporting. 2022-12-17 08:17:02 -05:00
cwFileSys.h cwFileSys.h/cpp : Added replaceDirectory/Filename/Extension() functions. 2021-05-10 08:30:22 -04:00
cwFlow.cpp cwFlow.cpp : Fixed possible uninitialized pointer in create(). 2023-02-20 15:26:07 -05:00
cwFlow.h Added flow::get_variable_value() 2023-01-05 07:26:25 -05:00
cwFlowCross.cpp Added flow::get_variable_value() 2023-01-05 07:26:25 -05:00
cwFlowCross.h Added flow::get_variable_value() 2023-01-05 07:26:25 -05:00
cwFlowProc.cpp cwFlowProc.cpp : Verify 'frame' and 'srate' in audio_merge. 2023-02-14 21:07:03 -05:00
cwFlowProc.h Added audio_meter and cwIo and flow support for metering. 2023-01-05 07:30:57 -05:00
cwFlowTypes.cpp Introduced fd_real_t to allow fbuf_t internal data vectors to be type double. 2023-01-05 07:24:07 -05:00
cwFlowTypes.h cwFlowTypes.h : Added comments 2023-01-07 09:27:36 -05:00
cwIo.cpp cwIo.cpp : The main callback no longer indicates a failure when the mutex times out. 2023-02-19 17:13:08 -05:00
cwIo.h cwAudioDevice*.h,cpp, cwIo.h,cpp, cwIoAudioPanel.cpp : Added deviceEnable(), deviceSeek() to audio device driver. 2023-02-19 14:16:37 -05:00
cwIoAudioMidi.cpp cwIoAudioMidi.cpp,cwIoMidiRecordPlay.cpp,cwIoMinTest.cpp : Updates to account for 'asyncFl' now implemented in cwIo API 2022-12-12 12:21:45 -05:00
cwIoAudioMidi.h audio_midi : Initial implementation of audio_midi io-based app. 2021-04-10 13:38:49 -04:00
cwIoAudioMidiApp.cpp cwIoAudioMidiApp.cpp,html/audio_midi/ui.cfg : Updates to support current version of IO. 2023-02-14 20:59:06 -05:00
cwIoAudioMidiApp.h cwIoAudioMidiApp.h/cpp,cwIoAudioRecordPlay.h/cpp,cwIoMidiRecordPlay.h/cpp: Initial commit. 2021-05-10 08:38:10 -04:00
cwIoAudioPanel.cpp cwAudioDevice*.h,cpp, cwIo.h,cpp, cwIoAudioPanel.cpp : Added deviceEnable(), deviceSeek() to audio device driver. 2023-02-19 14:16:37 -05:00
cwIoAudioPanel.h cwIoAudioPanel.h/cpp,cwIoSocketChat.h/cpp, Makefile.am, cwIoTest.cpp : Initial commit of cwIoAudioPanel and cwIoSocketChat. 2021-01-31 11:16:08 -05:00
cwIoAudioRecordPlay.cpp cwIoAudioMidiApp,cwIoAudioRecordPlay,cwIoMidiRecordPlay : Add 'mute' feature 2022-11-11 14:03:22 -05:00
cwIoAudioRecordPlay.h cwIoAudioMidiApp,cwIoAudioRecordPlay,cwIoMidiRecordPlay : Add 'mute' feature 2022-11-11 14:03:22 -05:00
cwIoFlow.cpp Added flow::get_variable_value() 2023-01-05 07:26:25 -05:00
cwIoFlow.h Added flow::get_variable_value() 2023-01-05 07:26:25 -05:00
cwIoMidiRecordPlay.cpp cwIoMidiRecordPlay.cpp : Include 'sci-pitch' in CSV row. 2023-02-14 21:03:01 -05:00
cwIoMidiRecordPlay.h Merge branch 'master' of https://gitea.larke.org/kevin/libcw 2022-11-11 14:05:49 -05:00
cwIoMinTest.cpp cwIoAudioMidi.cpp,cwIoMidiRecordPlay.cpp,cwIoMinTest.cpp : Updates to account for 'asyncFl' now implemented in cwIo API 2022-12-12 12:21:45 -05:00
cwIoMinTest.h cwKeyboard.h/cpp, cwIoMinTest.h/cpp, Makefile.am : Initial commit. 2022-06-12 16:50:44 -04:00
cwIoPresetSelApp.cpp cwIo.h/cpp : Replaced use of flow proc audioFileIn with audioDevFile() enable/seek API. 2023-02-19 14:18:53 -05:00
cwIoPresetSelApp.h cwIoPresetSelApp.h/cpp - pass in command line args from cwtest to change certain cfg. parameters. Insert loc. now identifies begin of segment instead of end 2022-12-17 17:54:39 -05:00
cwIoSocketChat.cpp cwIo.h/cpp,cwIoAudioMidi.cpp,cwIOAudioMidiApp.cpp,cwIoAudioPanel.cpp,cwIoPresetSelApp.cpp,wcIoSocketChat.cpp: Changed due to cwUi interface changes and new non-recursive object_t.get() default policy. 2021-11-03 11:09:07 -04:00
cwIoSocketChat.h cwIoAudioPanel.h/cpp,cwIoSocketChat.h/cpp, Makefile.am, cwIoTest.cpp : Initial commit of cwIoAudioPanel and cwIoSocketChat. 2021-01-31 11:16:08 -05:00
cwIoTest.cpp cwIo.h/cpp,cwIoTest.cpp : Fixed serial port monitor example in cwIoTest.cpp 2021-10-11 11:53:36 -04:00
cwIoTest.h cwIo.h/cpp, cwIoTest.h/cpp, html/ioTest.* : Many changes and additions to support first working Ui and audio subsystem. 2021-01-20 13:13:11 -05:00
cwKeyboard.cpp cwKeyboard.h/cpp, cwIoMinTest.h/cpp, Makefile.am : Initial commit. 2022-06-12 16:50:44 -04:00
cwKeyboard.h cwKeyboard.h/cpp, cwIoMinTest.h/cpp, Makefile.am : Initial commit. 2022-06-12 16:50:44 -04:00
cwLex.cpp Standardized filesys and mem namespaces. 2019-12-27 21:51:28 -05:00
cwLex.h Initial implementation cwTcpSocket* 2019-12-27 16:52:45 -05:00
cwLib.cpp Changes to support autotools build. 2020-03-24 08:51:51 -04:00
cwLib.h cwLib.h/cpp, cwMutex.h/cpp : Initial commit. 2020-03-04 14:05:54 -05:00
cwLog.cpp cwLog.cpp : Fix bug where sysStr was printed on info level logs 2022-12-16 11:30:41 -05:00
cwLog.h cwLog.h/cpp : Added setOutputCb() and setFormatCb(). cwLogMod() now call log::msg() directly. 2021-12-29 21:35:10 -05:00
cwMath.cpp cwMath.h/cpp : Populate cwMath from libcm and move some functions from cwUtility to cwMath. 2021-08-15 15:51:09 -04:00
cwMath.h cwMath.h/cpp : Populate cwMath from libcm and move some functions from cwUtility to cwMath. 2021-08-15 15:51:09 -04:00
cwMdns.cpp cwTime.h/cpp,cwDnsSd.cpp,cwMdns.cpp : Changed cwTime interface to use all references rather than pointers as arguments. 2020-04-17 11:16:21 -04:00
cwMdns.h cwMdns.h/cpp : Initial commit. 2020-01-27 17:51:38 -05:00
cwMem.cpp Pine64 Updates. 2020-10-31 14:17:43 -04:00
cwMem.h cwMem.h : Expanded allocDupl() interfaces. Added printp(),appendStr() 2020-08-19 20:08:14 -04:00
cwMidi.cpp cwMidi.h/cpp : Added kMidiPortMdId MIDI File meta status id. 2021-02-21 08:47:29 -05:00
cwMidi.h cwMiidi.h,cwMidiFile.h/cpp,cwPianoScore.cpp : cwMidi.isNoteOn() now takes the message velocity value as well as the status. 2022-12-22 15:27:30 -05:00
cwMidiAlsa.cpp cwMidiAlsa.cpp : Added TODO comments. 2022-11-11 13:15:35 -05:00
cwMidiDecls.h cwMidiDecls.h : Removed deltaUs from midi::msg_t. 2021-05-10 08:35:10 -04:00
cwMidiFile.cpp cwMiidi.h,cwMidiFile.h/cpp,cwPianoScore.cpp : cwMidi.isNoteOn() now takes the message velocity value as well as the status. 2022-12-22 15:27:30 -05:00
cwMidiFile.h cwMidiFile.h : Update status checkers to check that the status is a channel message before accessing 'chMsgPtr' 2023-01-30 19:25:01 -05:00
cwMidiPort.cpp cwMidiPort.cpp: Print out message in testCallback(). 2021-08-15 16:03:56 -04:00
cwMidiPort.h Added 'decls' include files to hold public declarations for audio,midi,serial,socket, and websock modules. 2020-03-23 10:41:28 -04:00
cwMpScNbQueue.h cwMpScNbQueue.h : Initial commit. 2021-01-12 15:49:19 -05:00
cwMpScQueue.h cwMpScQueue.h : replace use of atomic exchange 2021-01-12 15:57:57 -05:00
cwMtx.cpp cwMtx.h,cpp : Added slice() and derivatives. 2020-09-22 13:33:32 -04:00
cwMtx.h cwMtx.h: Fixed calc. of ele_count(). 2021-08-15 15:58:38 -04:00
cwMutex.cpp cwMutex.cpp : Do not indicate failure when the mutex times out. 2023-02-19 17:11:39 -05:00
cwMutex.h cwMutex.h/cpp : Added lock() with a timeout option. 2022-12-12 12:19:56 -05:00
cwNbMem.cpp cwNbMem.h/cpp : Initial commit. 2020-01-27 17:51:56 -05:00
cwNbMem.h cwNbMem.h/cpp : Initial commit. 2020-01-27 17:51:56 -05:00
cwNN.cpp cwDataSet.h/cpp, cwNN.h/cpp : Updates. 2020-10-30 09:40:39 -04:00
cwNN.h cwDataSet.h/cpp, cwNN.h/cpp : Updates. 2020-10-30 09:40:39 -04:00
cwNumericConvert.h cwNumericConvert.h : Remove verification of double value vs d_min in numeric_convert(). 2021-08-15 15:57:54 -04:00
cwObject.cpp cwObject.cpp : Added use of _udiff() to avoid unsigned subtractions from wrapping around 0. 2021-12-27 20:28:09 -05:00
cwObject.h cwObject.h/cpp : Added next_child_ele(). Renamed _objAppendLeftMostNode() to _objAppendRightMostNode(). 2021-12-25 22:11:14 -05:00
cwObjectTemplate.h cwObject.h/cpp : Added next_child_ele(). Renamed _objAppendLeftMostNode() to _objAppendRightMostNode(). 2021-12-25 22:11:14 -05:00
cwPianoScore.cpp cwPianoScore.cpp : Fix typo in event_to_string() output format. 2023-01-14 13:35:37 -05:00
cwPianoScore.h cwPianoScore.h/cpp : Added loc_to_measure() and loc_to_next_note_on_measure() 2022-12-05 17:21:02 -05:00
cwPresetSel.cpp cwIoPresetSelApp.cpp, cwPresetSel.h/cpp: Fix problem where correct preset was not selected when playing outside the currently selected fragment. 2023-01-21 11:49:07 -05:00
cwPresetSel.h cwIoPresetSelApp.cpp, cwPresetSel.h/cpp: Fix problem where correct preset was not selected when playing outside the currently selected fragment. 2023-01-21 11:49:07 -05:00
cwPvAudioFileProc.cpp Updates in preparation for variable length FT windows. 2022-12-05 17:19:58 -05:00
cwPvAudioFileProc.h cwAudioFileProc.h/cpp, cwAudioTransforms.h/cpp, cwPvAudioFileProc.h/cpp: Initial commit. 2021-08-15 16:06:29 -04:00
cwScoreFollower.cpp cwScoreFollow.cpp : Update comments. 2023-01-30 19:40:23 -05:00
cwScoreFollower.h cwCmInterface.h/cpp, cwScoreFollower.h/cpp, Makefile.am : Initial score_follow development 2023-01-30 19:38:11 -05:00
cwSerialPort.cpp cwSerialPort.cpp : fix bug where the incorrect byte count could be sent on a receive callback. 2020-03-16 22:54:14 -04:00
cwSerialPort.h Added 'decls' include files to hold public declarations for audio,midi,serial,socket, and websock modules. 2020-03-23 10:41:28 -04:00
cwSerialPortDecls.h Added 'decls' include files to hold public declarations for audio,midi,serial,socket, and websock modules. 2020-03-23 10:41:28 -04:00
cwSerialPortSrv.cpp cwSerialPort.h/cpp,cwSerialPortSrv.h/cpp : serialPort now manages multiple ports. 2020-03-05 22:04:53 -05:00
cwSerialPortSrv.h cwSerialPort.h/cpp,cwSerialPortSrv.h/cpp : serialPort now manages multiple ports. 2020-03-05 22:04:53 -05:00
cwSocket.cpp cwSocket.cpp : Added error msg. 2022-08-31 14:00:01 -04:00
cwSocket.h cwSocket.h : Updated comments. 2021-01-31 11:08:09 -05:00
cwSocketDecls.h cwSocket.h/cpp : Changed name of cbId_t to cbOpId_t 2020-04-01 10:46:31 -04:00
cwSpScBuf.cpp Pine64 Updates. 2020-10-31 14:17:43 -04:00
cwSpScBuf.h cwSpScBuf.h/cpp, cwThreadMach.h/cpp : initial commit. 2020-04-09 21:06:44 -04:00
cwSpScQueueTmpl.cpp Pine64 Updates. 2020-10-31 14:17:43 -04:00
cwSpScQueueTmpl.h cwSpScQueueTmpl.h : Change operation such that get() ony returns empty records. 2020-04-19 15:17:11 -04:00
cwString.cpp cwString, cwDsp : Initial commit. 2020-10-04 10:48:27 -04:00
cwString.h cwString, cwDsp : Initial commit. 2020-10-04 10:48:27 -04:00
cwSvg.cpp cwFlowCross.cpp,cwFlowTypes.cpp, cwSvg.cpp : Fix some benign uninitialized values. 2022-12-22 15:25:54 -05:00
cwSvg.h cwSvg.h/cpp : Removed unused flags from svg::write(). 2020-12-29 11:21:00 -05:00
cwTcpSocket.cpp cwTcpSocket.cpp : Fixed signed/unsigned compare. 2020-04-16 11:11:09 -04:00
cwTcpSocket.h cwTcpSocket.h/cpp : Remove the handle_t argument in initAddr() 2020-03-16 22:52:21 -04:00
cwTcpSocketSrv.cpp Many changes and additions to cwTcpSocket* to support MDNS and DNS-SD operations. 2020-02-12 13:25:13 -05:00
cwTcpSocketSrv.h Many changes and additions to cwTcpSocket* to support MDNS and DNS-SD operations. 2020-02-12 13:25:13 -05:00
cwTcpSocketTest.cpp Many changes and additions to cwTcpSocket* to support MDNS and DNS-SD operations. 2020-02-12 13:25:13 -05:00
cwTcpSocketTest.h Many changes and additions to cwTcpSocket* to support MDNS and DNS-SD operations. 2020-02-12 13:25:13 -05:00
cwText.cpp cwText.cpp : Assert that v is non-null on call to toText(). 2021-12-27 20:30:08 -05:00
cwText.h cwText.h/cpp : Added textIsEqual(), textIsNotEqual(). 2021-11-05 22:22:30 -04:00
cwTextBuf.cpp Standardized filesys and mem namespaces. 2019-12-27 21:51:28 -05:00
cwTextBuf.h Many changes and additions. 2019-12-24 10:05:24 -05:00
cwThread.cpp cwThread.cpp : Fix bug where waitTimeMicrosSecs was not properly updates. 2020-12-11 15:57:35 -05:00
cwThread.h cwThread.h/cpp : thread_id_t is changed form unsigned to unsigned long long. 2020-01-27 17:50:57 -05:00
cwThreadMach.cpp cwThreadMach.h/cpp : Many changes to support use in cwIo. 2021-01-20 13:11:44 -05:00
cwThreadMach.h cwThreadMach.h : Add comments. 2022-06-12 12:15:32 -04:00
cwTime.cpp cwTime.h/cpp : Added advanceMicros(). 2023-01-14 17:15:55 -05:00
cwTime.h cwTime.h/cpp : Added advanceMicros(). 2023-01-14 17:15:55 -05:00
cwUi.cpp cwUi.cpp : Warn if the UI resource does not have a 'main' element. 2022-12-20 10:33:51 -05:00
cwUi.h cwUi.cpp: Received 'value' messages are now automatically reflected to other Websock sessions. 2022-12-13 16:53:10 -05:00
cwUiDecls.h uiDecls.h : Added explicit numbers to enum's comments. 2022-05-21 09:28:17 -04:00
cwUiTest.cpp cwUi,cwIo,cwUiTest.cpp,html/uiTest/js/ui.js,html/uiTest/ui.cfg : Added 'string_disp' type. 2021-12-27 16:48:58 -05:00
cwUiTest.h cwUi.h/cpp,cwUiTest.h/cpp, cwUiDecls.h : Moved public variables to cwUiDecls.h. Added a version of create() which uses an arg_t record. Added parseArgs() and releaseArgs(). 2021-01-20 13:10:56 -05:00
cwUtility.cpp cwMath.h/cpp : Populate cwMath from libcm and move some functions from cwUtility to cwMath. 2021-08-15 15:51:09 -04:00
cwUtility.h cwUtility : Added powerOfTwo() functions. 2020-10-04 10:47:03 -04:00
cwVariant.cpp cwVariant.h/cpp, Makefile.am : Initial commit. 2020-12-11 15:58:06 -05:00
cwVariant.h cwVariant.h/cpp, Makefile.am : Initial commit. 2020-12-11 15:58:06 -05:00
cwVectOps.h cwVectOps.h : Added interleave() and deinterleave() 2023-02-14 20:56:39 -05:00
cwWebSock.cpp cwWebSock.cpp: replace use of MpScNbQueue until MpScQueue can be debugged. 2021-01-12 17:05:34 -05:00
cwWebSock.h cwWebSock.h/cpp : Added 'sessionId' to send() (and msg_t) to allow a message to be sent to a specific endpoint. 2020-03-31 12:53:14 -04:00
cwWebSockDecls.h Added 'decls' include files to hold public declarations for audio,midi,serial,socket, and websock modules. 2020-03-23 10:41:28 -04:00
cwWebSockSvr.cpp Pine64 Updates. 2020-10-31 14:17:43 -04:00
cwWebSockSvr.h Pine64 Updates. 2020-10-31 14:17:43 -04:00
dsp_recorder_plot.py dsp_recorder_plot.py : Initial commit of plotter for cwDspTransforms:recorder. 2021-12-19 12:21:02 -05:00
Makefile.am Added cwAudioDeviceFile.h/cpp. 2023-02-14 20:57:09 -05:00
README.md README.md : Audio device file updates. 2023-02-14 21:08:54 -05:00

Audio Dev. File

  1. Try different combinations of including input and output channels and groups. Specify an input file, but not an input group. Specify an input group but not an input file ....

TODO: fix cwDsp.h: ampl_to_db(),db_to_ampl(), add pow_to_db() and db_to_pow(). Implement vectorized version in terms of the scalar versions in cwDsp.h. Decide on standard dB range. e.g. -100 to 0, 0 to 100 ....

  • Flow Variables Class ** Attributes

    • type: real,int,string,audio,spectrum,enum

    • flags: attribute flags

      • src: This variable must be connected.
      • multi: This variable may be instantiated multiple times
      • fan_in: This variable allows multiple incoming connections.
    • value:

      • real,int { min,max,value,center,step }
      • enum [ list of (id,label) pairs ]
    • doc: documentation string

    • max_multi: max count of instantiations due to multiple connections

    • min_multi: min count of instantiations due to multiple connections

  • Flow Proc Class ** Attributes

    • doc: documentation string
    • sub_proc:
      • sub_proc_cnt: set an absolute sub_proc_cnt

      • sub_proc_cnt_min:

      • sub_proc_cnt_max:

      • sub_proc_var

        • label
        • flags: [ audio_chs, multi_chs, fan_in_chs ]

        Calculate the sub_proc_cnt based on the count of mult's,fan_ins, and audio channels.

  • Var Map:

#+BEGIN_SRC c typedef struct variable_str {

variable_str* var_link; // instance_t varL links 

} variable_t;

typedef struct proc_desc { var_desc_t* varDescA; // description of each base variable unsigned varDescN;

} proc_desc_t;

typedef struct varBase_str { char* label; // label assigned to this 'mult' unsigned multIdx; // mult index variable_t* baseVar; // all variables have a base instance (chIdx=kAnyChIdx) unsigned subProcN; // count of times this variable is replicated to specialize for a given subprocess variable_t* subProcA[ subProcN ]; // } varBase_t;

typedef struct varMap_str { unsigned multN; // count of times this variable is replicated based on multiple incoming connections to the same input variable label. varBase_t* multA[ multN ] // pointer to each base variable } varMap_t;

typedef struct instance_str { variable_t* varL; // variable linked list: list of all variable instances unsigned maxVId; // maximum application supplied vid. In general maxVId+1 == proc_desc_t.varDescN varMap_t varMap[ maxVId ]; // maps an application vid to a list of variable instances } instance_t;

#+END_SRC

  • Plan

** Flow processor 'multi' processor: Add the ability for a processor to expand the number of variables based on incoming connections.

  • Variables with this capability must have the 'multi' attribute in the class description.
  • The new variables will be named by adding a suffix in the connection command. e.g. in:{ in.a:out.foo } connect the output out.foo to a new variable instantiated on the the local variable description 'in'.
  • The new variable may then be addressed by referring to 'in.a'.
  • The proc instance may then ask for a count of variable instances for a given base varaible. var_get_multi_count( ...,'in') and address them by var_get( ...,'in',multi_idx).
  • Note that once a variable is given the 'multi' attribute the only way for the instance to access the variable is by supplying the 'multi' index since the variable label alone will not be adequate to select among multiple instances.

** Flow processor Fan-in capability: Add the ability for a processor variables to support multiple incoming connections.

  • Fan-in capability must be enabled in the processor class description with the 'fan-in' attribute.
  • The array of variables associated with fan-in connections will be addressed via ".".
  • The count of inputs to a fan-in varaible instance can be accessed via: var_fan_in_count( ...,var_label)
  • The variable instance associated with each fan-in connection can be accessed with var_get( ...,'in',fan_in_idx).
  • Note that once a variable is given the 'fan-in' attribute a fan_in_idx must be used to access it.

** Add MIDI processors - this may be complicated by cross fading scheme.

  • maybe cross-faded proc's should be all placed in a 'sub-net' and only those processes would then be cross faded.

** Add subnets. (see outline below) ** Add auto-UI (this will require a separate app).

  • Functionality ** libcw:
  • Remove dependency on locally built websockets library.

  • Remove applications from the libcw folder and put them in their own folders. (breakout libcw from application / reorganize project) Allow ui.js to be shared by all apps.

** UI:

  • Add support for custom controls
  • Document the UI resource file format.
  • Document the UI client/server protocol.
  1. The message formats to and from the server and the javascript client.
  2. When the messages are sent.
  • UI: Add an option to print the UI elment information as they are created. This is a useful way to see if id maps are working. Print: ele name, uuid, appId and parent name, uuid, appId

** Flow:

  • Create automatic UI for proc's.
  • Create the ability to script sub-networks.
  • Create true plug-in architecture - requires a C only interface.
  • Add a callback function to inform the app when a variable changes. The same callback could be used to map variable labels to id's at startup. This callback may be a key part of adding an automatic UI.
  • Simplify the coding of processors by having the system call the instance for each variable. This will make createing most processors a matter of responding to simple requests from the system. More complex processors could still be created using the current technique of calling explicit functions (e.g. register_and_get(), register_and_set())

*** Subnet scheme:

{
    balanced_mix: {

	doc: "This is a two channel balancer network.",

    network: {
		ain:    { class: port, source:merge.in0, doc:"Audio input."},
		ain_alt:{ class: port, source.merge.in1, doc:"Alternate audio input."},
		bal_in  { class: port, type: real,       doc:"Mix balance control." },
				    
		bal:    { class: balance,     in:{ in:bal_in.out } },	    
		merge:  { class: audio_merge, in:{ in.0:ain, in.1:ain_alt } }
		gain:   { class: audio_gain   in:{ in:merge.out, gain:bal.out } },
	    
		aout:   { class: port, type: audio, in:{ gain.out } }
	  }
    } 
}
  • Create a class description by parsing the subnet and converting the 'port' instances into a variable definitions.

  • Port instances are just proc's that have a single variable but do not implement any of the processing functions. The variables act as 'pass-through' variables that connect variables outside the subnet to variables inside the subnet.

  • The subnet itself will be held inside an 'instance_t' and will pass on 'exec()' calls to the internal instance processor chain.

  • The current flow architecture only allows static connections. This allows proc variables to be proxied to other proc variables. This doesn't scale well for processes with many variables (e.g. matrix mixer). For processes with many variables a message passing scheme works better because it allows a message to dynamically address a process (e.g. (set-in-channel-1-gain-to-42) 'set','in',1,'gain',42), 'set','out',4,'delay',15)

Note that it would be easy to form these messages on the stack and transmit them to connected processes.

  • To do list:

** libcw

  • Fix the time functions to make them more convenient and C++ish.
  • libcw: document basic functionality: flow, UI, Audio

** Flow

  • Implement MIDI processors.

  • Implement flow procs for all libcm processsors.

  • Create default system wide sample rate.

  • Allow gain to be set on any audio input or output.

  • flow metering object with resetable clip indicator and audio I/O meters

  • indicate drop-outs that are detected from the audio IO system

  • allow a pre/post network before and after cross fader

  • allow modifiable FFT window and hop length as part of preset

  • add selectable audio output file object to easily test for out of time problems

  • Add attributes to proc variables:

    1. 'init' this variable is only used to initialize the proc. It cannot be changed during runtime. (e.g. audio_split.map)
    2. 'scalar' this variable may only be a scalar. It can never be placed in a list. (e.g. sine_tone.chCnt)
    3. 'multi' this src variable can be repeated and it's label is always suffixed with an integer.
    4. 'src' this variable must be connected to a source.
    5. 'min','max' for numeric variables.
    6. 'channelize' The proc should instantiate one internal process for each input channel. (e.g. spec_dist )
  • Create a var args version of 'var_get()' in cwFlowTypes.h.

  • add attribute list to instances: [ init_only, scalar_only, print="print values", ui ]

  • why are multiple records given in the 'args:{}' attribute?

** UI:

  • Notes on UI id's:
  1. The appId, when set via an enum, is primarily for identifying a UI element in a callback switch statement. There is no requirement that they be unique - although it may be useful that they are guaranteed to be unique or warned when they are not. Their primary use is to identify a UI element or class of UI elements in a callback switch statement. Note that the callback also contains the uuId of the element which can then be used to send information back, or change the state of, the specific element which generated the callback. In this case there is never a need to do a appId->uuId lookup because the callback contains both items.

  2. UUid's are the preferred way to interact from the app to the UI because they are unique and the fastest way to lookup the object that represents the element.

  3. The 'blob' is useful for storing application information that is associated with an UI element. Using the 'blob' can avoid having to maintain a data structure which parallels the internal UI data structure for application related data. The 'blob' can be accessed efficiently via the uuId.

  4. The most labor intensive GUI related accesses are changing the state of a UI element outside of a callback from that GUI element. In this case it may be advantageous to store UUID's of elements which affect one anothers state within each others blobs. Alternatively use uiElementChildCout() and uiElementChildIndexToUuid() or uiElementChildAppIdToUuid() to iterate child elements given a parent element uuid.

  • Fix crash when '=' is used as a pair separator rather than ':'. cwUi is not noticing when a UI resource file fails to parse correctly. This may be a problem in cwObject or in cwUI.

  • Fix bug where leaving out the ending bracket for the first 'row' div in ui.cfg causes the next row to be included in the first row, and no error to be generated, even though the resource object is invalid (i.e. there is a missing brace).

  • The UI needs to be better documented. Start by giving clear names to the various parts: Browser, UI Manager, UI Server, Application. Maybe describe in Model,View,Controller terms?

  • Document the meaning and way that id's and names/labels are used, and intended to be used, and found by UI. As it is they are confusing.

  • The UI app id map should be validated after the UI is created. In otherwords the parent/child pairs shoud actually exists.

  • Arrange the project layout so that all the UI based apps use the same ui.js. Currently changes and improvements to one version of ui.js cannot be automatically shared.

  • uiSetValue() should be optionally reflected back to the app with kValueOpId messages. This way all value change messages could be handled from one place no matter if the value changes originate on the GUI or from the app.

  • The ui manageer should buffer the current valid value of a given control so that the value can be accessed synchronously. This would prevent the application from having to explicitely store all UI values and handle all the 'value' and 'echo' request. It would support a model where the UI values get changed and then read by the app (e.g. getUiValue( appId, valueRef)) just prior to being used. As it is the UI values that are on the interface cannot be accessed synchronously instead the app is forced to notice all 'value' changes and store the last legal value. (12/22: Given that the cwUi.cpp _transmitTree() function appears to the current value of each control to new remote WS Sessions - the value may actually already be available. Examine how this works. Is 'value' and 'attribute' like 'order'?)

  • Using the 'blob' functionality should be the default way for tying UI elements to program model. Rewrite the UI test case to reflect this.

  • Add an ui::appIdToUuId() that returns the first matching appId, and then optionally looks for duplicates as an error checking scheme.

  • The ui eleA[] data structure should be changed to a tree because the current expandable array allows empty slots which need to be checked for whenever the list is iterated. It is also very inefficient to delete from the eleA[] because an exhaustive search is required to find all the children of the element to be deleted.

  • UI needs a special UUID (not kInvalidId) to specify the 'root' UI element. See note in cwUi._createFromObj()

** Audio:

  • Should a warning be issued by audioBuf functions which return a set of values: muteFlags(),toneFlags(), gain( ... gainA) but where the size of the dest array does not match the actual number of channesl?

  • cwAudioBuf.cpp - the ch->fn in update() does not have the correct memory fence.

  • Replace 24 bit read/write in cwAudioFile.cpp

  • Remove Audio file operations that have been superceded by 'flow' framework.

** Socket

  • Any socket function which takes a IP/port address should have a version which also takes a sockaddr_in*.

** Websocket

  • cwWebsock is allocating memory on send().
  • cwWebsock: if the size of the recv and xmt buffer, as passed form the protocolArray[], is too small send() will fail without an error message. This is easy to reproduce by simply decreasing the size of the buffers in the protocol array.

Object

  • Look at 'BUG' warnings in cwNumericConvert.h.

  • cwObject must be able to parse without dynamic memory allocation into a fixed buffer

  • cwObject must be able to be composed without dynamic memory allocation or from a fixed buffer.

  • Clean up the cwObject namespace - add an 'object' namespace inside 'cw'

  • Add underscore to the member variables of object_t.

  • numeric_convert() in cwNumericConvert.h could be made more efficient using type_traits.

  • numeric_convert() d_min is NOT zero, it's smallest positive number, this fails when src == 0. min value is now set to zero.

  • Change file names to match object names

  • Improve performance of load parser. Try parsing a big JSON file and notice how poorly it performs.

** Misc

  • logDefaultFormatter() in cwLog.cpp uses stack allocated memory in a way that could easily be exploited.

  • lexIntMatcher() in cwLex.cpp doesn't handle 'e' notation correctly. See note in code.

  • thread needs setters and getters for internal variables

  • change cwMpScNbQueue so that it does not require 'new'.

  • (DONE) change all NULL's to nullptr

  • (DONE) implement kTcpFl in cwTcpSocket.cpp

** Documentation

*** UI Control Creation Protocol

The UI elements have four identifiers:

uuId - An integer which is unique among all identifiers for a given cwUi object. appId - A constant (enumerated) id assigned by the application. Unique among siblings. jsId - A string id used by Javascript to identify a control. Unique among siblings. jsUuId - An integer which is unique among all identifers for the browser representation of a given cwUi object.

The 'jsId' is selected by the application when the object is created. The 'jsUuId' is generated by the JS client when the UI element is created. The 'uuId' is generated by the UI server when the JS client registers the control. The 'appId' is assigned by the UI server when the JS client regsiters the control.

Client sends 'init' message. Server sends 'create' messages. Client sends 'register' messages. Server send' 'id_assign' messages.

*** sockaddr_in reference

#include <netinet/in.h>

struct sockaddr_in {
    short            sin_family;   // e.g. AF_INET
    unsigned short   sin_port;     // e.g. htons(3490)
    struct in_addr   sin_addr;     // see struct in_addr, below
    char             sin_zero[8];  // zero this if you want to
};

struct in_addr { unsigned long s_addr; // load with inet_aton() };

*** Development Setup

  sudo dnf install g++ fftw-devel alsa-lib-devel libubsan
  1. Install libwebsockets.
    sudo dnf install openssl-devel cmake
    cd sdk
    git clone https://libwebsockets.org/repo/libwebsockets
    cd libwebsockets
    mkdir build
    cd build
    cmake -DCMAKE_INSTALL_PREFIX:PATH=/home/kevin/sdk/libwebsockets/build/out ..
  1. Environment setup:

    export LD_LIBRARY_PATH=~/sdk/libwebsockets/build/out/lib

*** Raspberry Pi Build Notes:

cd sdk
mkdir libwebsockets
cmake -DCMAKE_INSTALL_PREFIX:PATH=/home/pi/sdk/libwebsockets/build/out -DLWS_WITH_SSL=OFF ..
make
sudo make install

apt install libasound2-dev

*** Flow Notes:

  • When a variable has a variant with a numberic channel should the 'all' channel variant be removed?

  • Check for duplicate 'vid'-'chIdx' pairs in var_regster(). (The concatenation of 'vid' and 'chIdx' should be unique

  • When a proc. goes into exec state there should be a guarantee that all registered variables can be successfully read. No error checking should be required.

(How about source variables? these can never be written.)

  • Make an example of a repeating input port. For example a mixer than takes audio input from multiple processors.

  • Make an example of a proc that has a generic port which allows any type, or a collection of specific types, to pass through. For example a 'selector' (n inputs, 1 output) or a router (1 signal to n outputs)

  • Create a master cross-fader.

DONE: Add a version of var_register() that both registers and returns the value of the variable.

*** Flow Instance Creation:

  1. Create all vars from the class description and initially set their value to the default value given in the class. chIdx=kAnyChIdx.

Note that all vars must be included in the class description.

  1. Apply the preset record from the class description according to the label given in the instance definition.

If the variable values are given as a scalar then the existing variable is simply given a new value.

If the variable values are given as a list then new variables records will be created with explicit channels based on the index of the value in the list. This is referred to as 'channelizing' the variable because the variable will then be represented by multiple physical variable records - one for each channel. This means that all variables will have their initial record, with the chIdx set to 'any', and then they may also have further variable records will for each explicit channel number. The complete list of channelized variable record is kept, in channel order, using the 'ch_link' links with the base of the list on the 'any' record.

  1. Apply the variable values defined in the instance 'args' record. This application is treated similarly to the 'class' preset. If the variable value is presented in a list then the value is assigned to a specific channel if the channel already exists then the value is simply replaced, if the channel does not exist then the variable is 'channelized'.

  2. The varaibles listed in the 'in' list of the instance cfg. are connected to their source variables.

  3. The custom class constructor is run for the instance.

Within the custom class constructor the variables to be used by the instance are 'registered' via var_register(). Registering a variable allows the variable to be assigned a constant id with which the instance can access the variable very efficiently.

If the channel associated with the registered variable does not yet exist for the variable then a channelized variable is first created before registering the variable.

  1. The internal variable id map is created to implement fast access to registered variables.