src/JackCommand.h
branchv_0
changeset 8 8ef1980db907
parent 6 b81bff3ebc4c
child 9 0d362165241e
equal deleted inserted replaced
7:a6337902e2ca 8:8ef1980db907
    48 
    48 
    49 int enqueueMessage(jack_nframes_t frames, void* arg);
    49 int enqueueMessage(jack_nframes_t frames, void* arg);
    50 
    50 
    51 class JackCommand {
    51 class JackCommand {
    52 private:
    52 private:
       
    53 	Configuration& configuration;
       
    54 	std::wstring_convert<std::codecvt_utf8<wchar_t>> convertor; // TODO: local system encoding
       
    55 
    53 	jack_port_t* jackPort = nullptr;
    56 	jack_port_t* jackPort = nullptr;
    54 	jack_ringbuffer_t* ringBuffer = nullptr;
    57 	jack_ringbuffer_t* ringBuffer = nullptr;
    55 	pthread_mutex_t messageThreadLock = PTHREAD_MUTEX_INITIALIZER;
    58 	pthread_mutex_t messageThreadLock = PTHREAD_MUTEX_INITIALIZER;
    56 	pthread_cond_t dataReady = PTHREAD_COND_INITIALIZER;
    59 	pthread_cond_t dataReady = PTHREAD_COND_INITIALIZER;
    57 
    60 
   153 		return result.str();
   156 		return result.str();
   154 	}
   157 	}
   155 
   158 
   156 public:
   159 public:
   157 
   160 
       
   161 	JackCommand(Configuration& configuration) : configuration(configuration) {
       
   162 	}
       
   163 
   158 	void finish(int sig) {
   164 	void finish(int sig) {
   159 		continueProcessing = false;
   165 		continueProcessing = false;
   160 	}
   166 	}
   161 
   167 
   162 	void processJackStream(std::shared_ptr<writer::RelationalWriter> writer, std::function<void() > relationalWriterFlush) {
   168 	void processJackStream(std::shared_ptr<writer::RelationalWriter> writer, std::function<void() > relationalWriterFlush) {
   172 		metadata.push_back({L"raw", TypeId::STRING});
   178 		metadata.push_back({L"raw", TypeId::STRING});
   173 		writer->startRelation(L"midi", metadata, true);
   179 		writer->startRelation(L"midi", metadata, true);
   174 		relationalWriterFlush();
   180 		relationalWriterFlush();
   175 
   181 
   176 		// Initialize JACK connection:
   182 		// Initialize JACK connection:
   177 		std::string clientName = "relpipe-in-jack";
   183 		std::string clientName = convertor.to_bytes(configuration.jackClientName);
   178 		jack_client_t* client = jack_client_open(clientName.c_str(), JackNullOption, nullptr);
   184 		jack_client_t* client = jack_client_open(clientName.c_str(), JackNullOption, nullptr);
   179 		if (client == nullptr) throw JackException(L"Could not create JACK client.");
   185 		if (client == nullptr) throw JackException(L"Could not create JACK client.");
   180 
   186 
   181 		ringBuffer = jack_ringbuffer_create(RING_BUFFER_SIZE * sizeof (MidiMessage));
   187 		ringBuffer = jack_ringbuffer_create(RING_BUFFER_SIZE * sizeof (MidiMessage));
   182 
   188