MIDIMessageQueue.cpp (1941B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim:set ts=2 sw=2 sts=2 et cindent: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "MIDIMessageQueue.h" 8 9 #include "mozilla/dom/MIDITypes.h" 10 11 namespace mozilla::dom { 12 13 MIDIMessageQueue::MIDIMessageQueue() : mMutex("MIDIMessageQueue::mMutex") {} 14 15 class MIDIMessageTimestampComparator { 16 public: 17 bool Equals(const MIDIMessage& a, const MIDIMessage& b) const { 18 return a.timestamp() == b.timestamp(); 19 } 20 bool LessThan(const MIDIMessage& a, const MIDIMessage& b) const { 21 return a.timestamp() < b.timestamp(); 22 } 23 }; 24 25 void MIDIMessageQueue::Add(nsTArray<MIDIMessage>& aMsg) { 26 MutexAutoLock lock(mMutex); 27 for (auto msg : aMsg) { 28 mMessageQueue.InsertElementSorted(msg, MIDIMessageTimestampComparator()); 29 } 30 } 31 32 void MIDIMessageQueue::GetMessagesBefore(TimeStamp aTimestamp, 33 nsTArray<MIDIMessage>& aMsgQueue) { 34 MutexAutoLock lock(mMutex); 35 int i = 0; 36 for (auto msg : mMessageQueue) { 37 if (aTimestamp < msg.timestamp()) { 38 break; 39 } 40 aMsgQueue.AppendElement(msg); 41 i++; 42 } 43 if (i > 0) { 44 mMessageQueue.RemoveElementsAt(0, i); 45 } 46 } 47 48 void MIDIMessageQueue::GetMessages(nsTArray<MIDIMessage>& aMsgQueue) { 49 MutexAutoLock lock(mMutex); 50 aMsgQueue.AppendElements(mMessageQueue); 51 mMessageQueue.Clear(); 52 } 53 54 void MIDIMessageQueue::Clear() { 55 MutexAutoLock lock(mMutex); 56 mMessageQueue.Clear(); 57 } 58 59 void MIDIMessageQueue::ClearAfterNow() { 60 MutexAutoLock lock(mMutex); 61 TimeStamp now = TimeStamp::Now(); 62 int i = 0; 63 for (auto msg : mMessageQueue) { 64 if (now < msg.timestamp()) { 65 break; 66 } 67 i++; 68 } 69 if (i > 0) { 70 mMessageQueue.RemoveElementsAt(0, i); 71 } 72 } 73 74 } // namespace mozilla::dom