git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4260 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.9.8
| @@ -14,7 +14,7 @@ extern "C" | |||||
| { | { | ||||
| #endif | #endif | ||||
| #define MAX_SERVERS 64 /* maximum concurrent servers */ | |||||
| #define MAX_SERVERS 8 /* maximum concurrent servers */ | |||||
| #define MAX_SHM_ID 256 /* generally about 16 per server */ | #define MAX_SHM_ID 256 /* generally about 16 per server */ | ||||
| #define JACK_SERVER_NAME_SIZE 256 /* maximum length of server name */ | #define JACK_SERVER_NAME_SIZE 256 /* maximum length of server name */ | ||||
| #define JACK_SHM_MAGIC 0x4a41434b /* shm magic number: "JACK" */ | #define JACK_SHM_MAGIC 0x4a41434b /* shm magic number: "JACK" */ | ||||
| @@ -212,7 +212,6 @@ JackWinMMEDriver::Open(bool capturing, bool playing, int in_channels, | |||||
| int | int | ||||
| JackWinMMEDriver::Read() | JackWinMMEDriver::Read() | ||||
| { | { | ||||
| jack_nframes_t buffer_size = fEngineControl->fBufferSize; | jack_nframes_t buffer_size = fEngineControl->fBufferSize; | ||||
| for (int i = 0; i < fCaptureChannels; i++) { | for (int i = 0; i < fCaptureChannels; i++) { | ||||
| input_ports[i]->ProcessJack(GetInputBuffer(i), buffer_size); | input_ports[i]->ProcessJack(GetInputBuffer(i), buffer_size); | ||||
| @@ -221,16 +220,14 @@ JackWinMMEDriver::Read() | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| int | int | ||||
| JackWinMMEDriver::Write() | JackWinMMEDriver::Write() | ||||
| { | { | ||||
| /* | |||||
| jack_nframes_t buffer_size = fEngineControl->fBufferSize; | jack_nframes_t buffer_size = fEngineControl->fBufferSize; | ||||
| for (int i = 0; i < fPlaybackChannels; i++) { | for (int i = 0; i < fPlaybackChannels; i++) { | ||||
| output_ports[i]->ProcessJack(GetOutputBuffer(i), buffer_size); | output_ports[i]->ProcessJack(GetOutputBuffer(i), buffer_size); | ||||
| } | } | ||||
| */ | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -50,9 +50,9 @@ JackWinMMEInputPort::JackWinMMEInputPort(const char *alias_name, | |||||
| size_t max_bytes, size_t max_messages) | size_t max_bytes, size_t max_messages) | ||||
| { | { | ||||
| thread_queue = new JackMidiAsyncQueue(max_bytes, max_messages); | thread_queue = new JackMidiAsyncQueue(max_bytes, max_messages); | ||||
| std::auto_ptr<JackMidiAsyncQueue> thread_queue_ptr(thread_queue); | |||||
| //std::auto_ptr<JackMidiAsyncQueue> thread_queue_ptr(thread_queue); | |||||
| write_queue = new JackMidiBufferWriteQueue(); | write_queue = new JackMidiBufferWriteQueue(); | ||||
| std::auto_ptr<JackMidiBufferWriteQueue> write_queue_ptr(write_queue); | |||||
| //std::auto_ptr<JackMidiBufferWriteQueue> write_queue_ptr(write_queue); | |||||
| sysex_buffer = new jack_midi_data_t[max_bytes]; | sysex_buffer = new jack_midi_data_t[max_bytes]; | ||||
| char error_message[MAXERRORLENGTH]; | char error_message[MAXERRORLENGTH]; | ||||
| MMRESULT result = midiInOpen(&handle, index, (DWORD)HandleMidiInputEvent, | MMRESULT result = midiInOpen(&handle, index, (DWORD)HandleMidiInputEvent, | ||||
| @@ -95,8 +95,8 @@ JackWinMMEInputPort::JackWinMMEInputPort(const char *alias_name, | |||||
| snprintf(name, sizeof(name) - 1, "%s:capture_%d", client_name, index + 1); | snprintf(name, sizeof(name) - 1, "%s:capture_%d", client_name, index + 1); | ||||
| jack_event = 0; | jack_event = 0; | ||||
| started = false; | started = false; | ||||
| write_queue_ptr.release(); | |||||
| thread_queue_ptr.release(); | |||||
| //write_queue_ptr.release(); | |||||
| //thread_queue_ptr.release(); | |||||
| return; | return; | ||||
| unprepare_header: | unprepare_header: | ||||
| @@ -164,14 +164,14 @@ JackWinMMEInputPort::ProcessJack(JackMidiBuffer *port_buffer, | |||||
| if (! jack_event) { | if (! jack_event) { | ||||
| jack_event = thread_queue->DequeueEvent(); | jack_event = thread_queue->DequeueEvent(); | ||||
| } | } | ||||
| for (; jack_event; jack_event = thread_queue->DequeueEvent()) { | |||||
| for (; jack_event; jack_event = thread_queue->DequeueEvent()) { | |||||
| switch (write_queue->EnqueueEvent(jack_event)) { | switch (write_queue->EnqueueEvent(jack_event)) { | ||||
| case JackMidiWriteQueue::BUFFER_TOO_SMALL: | case JackMidiWriteQueue::BUFFER_TOO_SMALL: | ||||
| jack_error("JackWinMMEMidiInputPort::Process - The buffer write " | jack_error("JackWinMMEMidiInputPort::Process - The buffer write " | ||||
| "queue couldn't enqueue a %d-byte event. Dropping " | "queue couldn't enqueue a %d-byte event. Dropping " | ||||
| "event.", jack_event->size); | "event.", jack_event->size); | ||||
| // Fallthrough on purpose | // Fallthrough on purpose | ||||
| case JackMidiWriteQueue::OK: | |||||
| case JackMidiWriteQueue::OK: | |||||
| continue; | continue; | ||||
| } | } | ||||
| break; | break; | ||||
| @@ -182,7 +182,8 @@ void | |||||
| JackWinMMEInputPort::ProcessWinMME(UINT message, DWORD param1, DWORD param2) | JackWinMMEInputPort::ProcessWinMME(UINT message, DWORD param1, DWORD param2) | ||||
| { | { | ||||
| set_threaded_log_function(); | set_threaded_log_function(); | ||||
| jack_nframes_t current_frame = GetCurrentFrame(); | |||||
| jack_nframes_t current_frame = GetCurrentFrame(); | |||||
| switch (message) { | switch (message) { | ||||
| case MIM_CLOSE: | case MIM_CLOSE: | ||||
| jack_info("JackWinMMEInputPort::ProcessWinMME - MIDI device closed."); | jack_info("JackWinMMEInputPort::ProcessWinMME - MIDI device closed."); | ||||
| @@ -195,13 +196,14 @@ JackWinMMEInputPort::ProcessWinMME(UINT message, DWORD param1, DWORD param2) | |||||
| case MIM_DATA: | case MIM_DATA: | ||||
| jack_midi_data_t message_buffer[3]; | jack_midi_data_t message_buffer[3]; | ||||
| jack_midi_data_t status = param1 & 0xff; | jack_midi_data_t status = param1 & 0xff; | ||||
| int length = GetMessageLength(status); | |||||
| int length = GetMessageLength(status); | |||||
| switch (length) { | switch (length) { | ||||
| case 3: | case 3: | ||||
| message_buffer[2] = param1 & 0xff0000; | |||||
| message_buffer[2] = (param1 >> 16) & 0xff; | |||||
| // Fallthrough on purpose. | // Fallthrough on purpose. | ||||
| case 2: | case 2: | ||||
| message_buffer[1] = param1 & 0xff00; | |||||
| message_buffer[1] = (param1 >> 8) & 0xff; | |||||
| // Fallthrough on purpose. | // Fallthrough on purpose. | ||||
| case 1: | case 1: | ||||
| message_buffer[0] = status; | message_buffer[0] = status; | ||||
| @@ -216,7 +218,7 @@ JackWinMMEInputPort::ProcessWinMME(UINT message, DWORD param1, DWORD param2) | |||||
| "input driver sent an MIM_DATA message with an invalid " | "input driver sent an MIM_DATA message with an invalid " | ||||
| "status byte."); | "status byte."); | ||||
| return; | return; | ||||
| } | |||||
| } | |||||
| EnqueueMessage(current_frame, (size_t) length, message_buffer); | EnqueueMessage(current_frame, (size_t) length, message_buffer); | ||||
| break; | break; | ||||
| case MIM_LONGDATA: | case MIM_LONGDATA: | ||||
| @@ -49,11 +49,11 @@ JackWinMMEOutputPort::JackWinMMEOutputPort(const char *alias_name, | |||||
| size_t max_messages) | size_t max_messages) | ||||
| { | { | ||||
| read_queue = new JackMidiBufferReadQueue(); | read_queue = new JackMidiBufferReadQueue(); | ||||
| std::auto_ptr<JackMidiBufferReadQueue> read_queue_ptr(read_queue); | |||||
| //std::auto_ptr<JackMidiBufferReadQueue> read_queue_ptr(read_queue); | |||||
| thread_queue = new JackMidiAsyncQueue(max_bytes, max_messages); | thread_queue = new JackMidiAsyncQueue(max_bytes, max_messages); | ||||
| std::auto_ptr<JackMidiAsyncQueue> thread_queue_ptr(thread_queue); | |||||
| //std::auto_ptr<JackMidiAsyncQueue> thread_queue_ptr(thread_queue); | |||||
| thread = new JackThread(this); | thread = new JackThread(this); | ||||
| std::auto_ptr<JackThread> thread_ptr(thread); | |||||
| //std::auto_ptr<JackThread> thread_ptr(thread); | |||||
| char error_message[MAXERRORLENGTH]; | char error_message[MAXERRORLENGTH]; | ||||
| MMRESULT result = midiOutOpen(&handle, index, (DWORD)HandleMessageEvent, | MMRESULT result = midiOutOpen(&handle, index, (DWORD)HandleMessageEvent, | ||||
| (DWORD)this, CALLBACK_FUNCTION); | (DWORD)this, CALLBACK_FUNCTION); | ||||
| @@ -84,8 +84,8 @@ JackWinMMEOutputPort::JackWinMMEOutputPort(const char *alias_name, | |||||
| snprintf(alias, sizeof(alias) - 1, "%s:%s:out%d", alias_name, name_tmp, | snprintf(alias, sizeof(alias) - 1, "%s:%s:out%d", alias_name, name_tmp, | ||||
| index + 1); | index + 1); | ||||
| snprintf(name, sizeof(name) - 1, "%s:playback_%d", client_name, index + 1); | snprintf(name, sizeof(name) - 1, "%s:playback_%d", client_name, index + 1); | ||||
| thread_ptr.release(); | |||||
| thread_queue_ptr.release(); | |||||
| //thread_ptr.release(); | |||||
| //thread_queue_ptr.release(); | |||||
| return; | return; | ||||
| destroy_thread_queue_semaphore: | destroy_thread_queue_semaphore: | ||||
| @@ -129,15 +129,12 @@ bool | |||||
| JackWinMMEOutputPort::Execute() | JackWinMMEOutputPort::Execute() | ||||
| { | { | ||||
| for (;;) { | for (;;) { | ||||
| jack_log("JackWinMMEOutputPort::Execute TOTO"); | |||||
| JackSleep(100000); | |||||
| if (! Wait(thread_queue_semaphore)) { | |||||
| if (! Wait(thread_queue_semaphore)) { | |||||
| jack_log("JackWinMMEOutputPort::Execute BREAK"); | jack_log("JackWinMMEOutputPort::Execute BREAK"); | ||||
| break; | break; | ||||
| } | |||||
| /* | |||||
| } | |||||
| jack_midi_event_t *event = thread_queue->DequeueEvent(); | jack_midi_event_t *event = thread_queue->DequeueEvent(); | ||||
| if (! event) { | if (! event) { | ||||
| break; | break; | ||||
| @@ -217,7 +214,7 @@ JackWinMMEOutputPort::Execute() | |||||
| "midiOutUnprepareHeader", result); | "midiOutUnprepareHeader", result); | ||||
| break; | break; | ||||
| } | } | ||||
| */ | |||||
| } | } | ||||
| stop_execution: | stop_execution: | ||||
| return false; | return false; | ||||
| @@ -262,10 +259,12 @@ JackWinMMEOutputPort::Init() | |||||
| void | void | ||||
| JackWinMMEOutputPort::ProcessJack(JackMidiBuffer *port_buffer, | JackWinMMEOutputPort::ProcessJack(JackMidiBuffer *port_buffer, | ||||
| jack_nframes_t frames) | jack_nframes_t frames) | ||||
| { | |||||
| read_queue->ResetMidiBuffer(port_buffer); | |||||
| { | |||||
| read_queue->ResetMidiBuffer(port_buffer); | |||||
| for (jack_midi_event_t *event = read_queue->DequeueEvent(); event; | for (jack_midi_event_t *event = read_queue->DequeueEvent(); event; | ||||
| event = read_queue->DequeueEvent()) { | |||||
| event = read_queue->DequeueEvent()) { | |||||
| switch (thread_queue->EnqueueEvent(event, frames)) { | switch (thread_queue->EnqueueEvent(event, frames)) { | ||||
| case JackMidiWriteQueue::BUFFER_FULL: | case JackMidiWriteQueue::BUFFER_FULL: | ||||
| jack_error("JackWinMMEOutputPort::ProcessJack - The thread queue " | jack_error("JackWinMMEOutputPort::ProcessJack - The thread queue " | ||||
| @@ -339,8 +338,6 @@ JackWinMMEOutputPort::Stop() | |||||
| bool | bool | ||||
| JackWinMMEOutputPort::Wait(HANDLE semaphore) | JackWinMMEOutputPort::Wait(HANDLE semaphore) | ||||
| { | { | ||||
| jack_log("JackWinMMEOutputPort::Wait %d", semaphore); | |||||
| DWORD result = WaitForSingleObject(semaphore, INFINITE); | DWORD result = WaitForSingleObject(semaphore, INFINITE); | ||||
| switch (result) { | switch (result) { | ||||
| case WAIT_FAILED: | case WAIT_FAILED: | ||||