# HG changeset patch # User Giulio Moro # Date 1440020405 -3600 # Node ID 9928b6366227f9a3b18e1eb91823706a61e614ab # Parent fb56681ab1d631a8a33b0fdea6ecfa5a8e198235 Refactored the Scope class into NetworkSend and Scope classes. No need for a global pointer anymore! diff -r fb56681ab1d6 -r 9928b6366227 core/NetworkSend.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/NetworkSend.cpp Wed Aug 19 22:40:05 2015 +0100 @@ -0,0 +1,144 @@ +//scope.cpp +#include + +#define BUILD_FOR_UDPRECEIVE_PLUGIN +#define NETWORK_AUDIO_BUFFER_SIZE 302 + +//initialize the static members of NetworkSend +bool NetworkSend::staticConstructed=false; +std::vector NetworkSend::objAddrs(0); +AuxiliaryTask NetworkSend::transmitAudioTask=NULL; + +void transmitAudio(){ + NetworkSend::sendAllData(); +} + +void NetworkSend::sendAllData(){ + for(unsigned int n=0; nsendData(); + } +} + +void NetworkSend::staticConstructor(){ + if(staticConstructed==true) + return; + staticConstructed=true; + transmitAudioTask = BeagleRT_createAuxiliaryTask(transmitAudio, 95, "transmitAudioTask"); //TODO: allow variable priority +}; + +NetworkSend::NetworkSend() +{ + sampleCount = 0; + channel.doneOnTime=true; + channel.index=channel.headerLength; //leave space for the heading message (channel, timestamp) + channel.timestamp=0; + channel.activeBuffer=0; + channel.readyToBeSent=false; +} +NetworkSend::~NetworkSend(){ + for(unsigned int n=0; n=getNumChannels()) //TODO: assert this + return; + channels[channel].log(value); +} + +void Scope::setup(){ + setup(44100, 9999, "127.0.0.1"); +} + +void Scope::setup(float sampleRate, int aPort, const char* aServer){ + for(int n=0; n +#include +#include +#include +#include + +#define NETWORK_AUDIO_BUFFER_SIZE 302 + +struct NetworkBuffer{ + int timestamp; + int channelNumber; + int activeBuffer; + int index; + float buffers[2][NETWORK_AUDIO_BUFFER_SIZE]; + bool doneOnTime; + bool readyToBeSent; + static const int headerLength=2; +}; + +class NetworkSend { + int sampleCount; + float sampleRate; + UdpClient udpClient; + static bool staticConstructed; + static void staticConstructor(); + static AuxiliaryTask transmitAudioTask; //TODO: allow different AuxiliaryTasks for different priorities (e.g.: audio vs scope) + static std::vector objAddrs; + public: + NetworkBuffer channel; + NetworkSend(); + ~NetworkSend(); + void setup(float aSampleRate); + void setup(float aSampleRate, int aChannelNumber, int aPort, const char *aServer); + void sendData(); + void log(float value); + void setPort(int aPort); + void setServer(const char* aServer); + void setChannelNumber(int aChannelNumber); + int getChannelNumber(); + static int getNumInstances(); + static void sendAllData(); +}; + +/** + * An array of NetworkSend objects with some default parameters + * + * All sending on the same port (defaults to 9999) + * All sending to the same server (defaults to 127.0.0.1) +*/ +class Scope { + std::vector channels; + void deallocate(); +public: + Scope(int aNumChannels); + ~Scope(); + void log(int channel, float value); + void setup(); + void setup(float sampleRate, int aPort, const char* aServer); + void sendData(); + void setPort(); + int getNumChannels(); +}; +#endif /* SCOPE_H */ diff -r fb56681ab1d6 -r 9928b6366227 include/Scope.h --- a/include/Scope.h Wed Aug 19 22:36:45 2015 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -//scope.cpp -#ifndef SCOPE_H_ -#define SCOPE_H_ - -#include -#include -#include -#include - -#define BUILD_FOR_UDPRECEIVE_PLUGIN -#define NETWORK_AUDIO_BUFFER_SIZE 302 - -struct NetworkBuffer{ - int timestamp; - int channelNumber; - int activeBuffer; - int index; - float buffers[2][NETWORK_AUDIO_BUFFER_SIZE]; - bool doneOnTime; - bool readyToBeSent; - int headerLength=2; - UdpClient udpClient; -}; - -#define NUM_SCOPE_CHANNELS 6 - -class NetworkIO { - int sampleCount; - float sampleRate; - AuxiliaryTask scopeTask; - int port; - public: - NetworkBuffer channel; - NetworkIO(); - ~NetworkIO(); - void setup(float aSampleRate); - void setup(float aSampleRate, int aChannelNumber); - void sendData(); - void log(float value); - void setPort(int aPort); - int getPort(); - void setChannelNumber(int aChannelNumber); - int getChannelNumber(); -}; - -class Scope { - NetworkIO *channels; - int numChannels; - void deallocate(); -public: - Scope(int aNumChannels); - ~Scope(); - void log(int channel, float value); - void setup(float sampleRate); - void sendData(); -}; -#endif /* SCOPE_H */ diff -r fb56681ab1d6 -r 9928b6366227 projects/scope/render.cpp --- a/projects/scope/render.cpp Wed Aug 19 22:36:45 2015 +0100 +++ b/projects/scope/render.cpp Wed Aug 19 22:40:05 2015 +0100 @@ -6,7 +6,8 @@ float gFrequency1, gFrequency2; float gInverseSampleRate; -Scope scope(1); //create a scope object with numChannels +Scope scope(6); //create a scope object with 6 channels +NetworkSend networkSend; // initialise_render() is called once before the audio rendering starts. // Use it to perform any initialisation and allocation which is dependent @@ -16,9 +17,11 @@ // in from the call to initAudio(). // // Return true on success; returning false halts the program. + bool setup(BeagleRTContext *context, void *userData) { - scope.setup(context->audioSampleRate); //call this once in setup to initialise the scope + scope.setup(); //call this once in setup to initialise the scope +// networkSend.setup(context->audioSampleRate, 0, 9999, "192.168.7.1"); gInverseSampleRate = 1.0/context->audioSampleRate; @@ -27,6 +30,7 @@ gFrequency1 = 200.0; gFrequency2 = 201.0; + return true; } @@ -40,16 +44,20 @@ static int count=0; for(unsigned int n = 0; n < context->audioFrames; n++) { - float chn1 = sinf(gPhase1); - float chn2 = sinf(gPhase2); - - float chn3 = context->audioIn[n*2 + 0]; - float chn4 = context->audioIn[n*2 + 1]; - - float chn5 = context->analogIn[(int)n/2*8 + 0]; - float chn6 = context->analogIn[(int)n/2*8 + 1]; - if((n&1)==0) - scope.log(0, chn1); + float chn0 = sinf(gPhase1); + float chn1 = sinf(gPhase2); + + float chn2 = context->audioIn[n*2 + 0]; + float chn3 = context->audioIn[n*2 + 1]; + + float chn4 = context->analogIn[(int)n/2*8 + 0]; + float chn5 = context->analogIn[(int)n/2*8 + 1]; + scope.log(0, chn0); + scope.log(1, chn1); + scope.log(2, chn2); + scope.log(3, chn3); + scope.log(4, chn4); + scope.log(5, chn5); // scope.log(chn1, chn2, chn3, chn4, chn5, chn6); //call this once every audio frame