Browse Source

Winmme driver working again.

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4260 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/1.9.8
sletz 14 years ago
parent
commit
09cedc138f
4 changed files with 29 additions and 33 deletions
  1. +1
    -1
      common/shm.h
  2. +1
    -4
      windows/winmme/JackWinMMEDriver.cpp
  3. +13
    -11
      windows/winmme/JackWinMMEInputPort.cpp
  4. +14
    -17
      windows/winmme/JackWinMMEOutputPort.cpp

+ 1
- 1
common/shm.h View File

@@ -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" */


+ 1
- 4
windows/winmme/JackWinMMEDriver.cpp View File

@@ -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;
} }




+ 13
- 11
windows/winmme/JackWinMMEInputPort.cpp View File

@@ -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:


+ 14
- 17
windows/winmme/JackWinMMEOutputPort.cpp View File

@@ -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:


Loading…
Cancel
Save