tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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