00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <new>
00021
00022 #include "JackMidiAsyncWaitQueue.h"
00023 #include "JackMidiUtil.h"
00024 #include "JackTime.h"
00025
00026 using Jack::JackMidiAsyncWaitQueue;
00027
00028 JackMidiAsyncWaitQueue::JackMidiAsyncWaitQueue(size_t max_bytes,
00029 size_t max_messages):
00030 JackMidiAsyncQueue(max_bytes, max_messages)
00031 {
00032 if (semaphore.Allocate("JackMidiAsyncWaitQueue", "midi-thread", 0)) {
00033 throw std::bad_alloc();
00034 }
00035 }
00036
00037 JackMidiAsyncWaitQueue::~JackMidiAsyncWaitQueue()
00038 {
00039 semaphore.Destroy();
00040 }
00041
00042 jack_midi_event_t *
00043 JackMidiAsyncWaitQueue::DequeueEvent()
00044 {
00045 return DequeueEvent((long) 0);
00046 }
00047
00048 jack_midi_event_t *
00049 JackMidiAsyncWaitQueue::DequeueEvent(jack_nframes_t frame)
00050 {
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 jack_time_t frame_time = GetTimeFromFrames(frame);
00063 jack_time_t current_time = GetMicroSeconds();
00064 return DequeueEvent((frame_time < current_time) ? 0 :
00065 (long) (frame_time - current_time));
00066 }
00067
00068 jack_midi_event_t *
00069 JackMidiAsyncWaitQueue::DequeueEvent(long usec)
00070 {
00071 return ((usec < 0) ? semaphore.Wait() : semaphore.TimedWait(usec)) ?
00072 JackMidiAsyncQueue::DequeueEvent() : 0;
00073 }
00074
00075 Jack::JackMidiWriteQueue::EnqueueResult
00076 JackMidiAsyncWaitQueue::EnqueueEvent(jack_nframes_t time, size_t size,
00077 jack_midi_data_t *buffer)
00078 {
00079 EnqueueResult result = JackMidiAsyncQueue::EnqueueEvent(time, size,
00080 buffer);
00081 if (result == OK) {
00082 semaphore.Signal();
00083 }
00084 return result;
00085 }