123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572 |
- // Copyright 2013 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #include "media/midi/midi_message_queue.h"
- #include <stddef.h>
- #include <stdint.h>
- #include "testing/gtest/include/gtest/gtest.h"
- namespace midi {
- namespace {
- const uint8_t kGMOn[] = {0xf0, 0x7e, 0x7f, 0x09, 0x01, 0xf7};
- const uint8_t kPartialGMOn1st[] = {0xf0};
- const uint8_t kPartialGMOn2nd[] = {0x7e, 0x7f, 0x09, 0x01};
- const uint8_t kPartialGMOn3rd[] = {0xf7};
- const uint8_t kGSOn[] = {
- 0xf0, 0x41, 0x10, 0x42, 0x12, 0x40, 0x00, 0x7f, 0x00, 0x41, 0xf7,
- };
- const uint8_t kNoteOn[] = {0x90, 0x3c, 0x7f};
- const uint8_t kPartialNoteOn1st[] = {0x90};
- const uint8_t kPartialNoteOn2nd[] = {0x3c};
- const uint8_t kPartialNoteOn3rd[] = {0x7f};
- const uint8_t kNoteOnWithRunningStatus[] = {
- 0x90, 0x3c, 0x7f, 0x3c, 0x7f, 0x3c, 0x7f,
- };
- const uint8_t kChannelPressure[] = {0xd0, 0x01};
- const uint8_t kChannelPressureWithRunningStatus[] = {
- 0xd0, 0x01, 0x01, 0x01,
- };
- const uint8_t kTimingClock[] = {0xf8};
- const uint8_t kSystemCommonMessageTuneRequest[] = {0xf6};
- const uint8_t kMTCFrame[] = {0xf1, 0x00};
- const uint8_t kBrokenData1[] = {0x92};
- const uint8_t kBrokenData2[] = {0xf7};
- const uint8_t kBrokenData3[] = {0xf2, 0x00};
- const uint8_t kDataByte0[] = {0x00};
- const uint8_t kReservedMessage1[] = {0xf4};
- const uint8_t kReservedMessage2[] = {0xf5};
- const uint8_t kReservedMessage1WithDataBytes[] = {0xf4, 0x01, 0x01,
- 0x01, 0x01, 0x01};
- template <typename T, size_t N>
- void Add(MidiMessageQueue* queue, const T(&array)[N]) {
- queue->Add(array, N);
- }
- template <typename T, size_t N>
- ::testing::AssertionResult ExpectEqualSequence(
- const char* expr1, const char* expr2,
- const T(&expected)[N], const std::vector<T>& actual) {
- if (actual.size() != N) {
- return ::testing::AssertionFailure()
- << "expected: " << ::testing::PrintToString(expected)
- << ", actual: " << ::testing::PrintToString(actual);
- }
- for (size_t i = 0; i < N; ++i) {
- if (expected[i] != actual[i]) {
- return ::testing::AssertionFailure()
- << "expected: " << ::testing::PrintToString(expected)
- << ", actual: " << ::testing::PrintToString(actual);
- }
- }
- return ::testing::AssertionSuccess();
- }
- #define EXPECT_MESSAGE(expected, actual) \
- EXPECT_PRED_FORMAT2(ExpectEqualSequence, expected, actual)
- TEST(MidiMessageQueueTest, EmptyData) {
- MidiMessageQueue queue(false);
- std::vector<uint8_t> message;
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- }
- TEST(MidiMessageQueueTest, RunningStatusDisabled) {
- MidiMessageQueue queue(false);
- Add(&queue, kGMOn);
- Add(&queue, kBrokenData1);
- Add(&queue, kNoteOnWithRunningStatus);
- Add(&queue, kBrokenData2);
- Add(&queue, kChannelPressureWithRunningStatus);
- Add(&queue, kBrokenData3);
- Add(&queue, kNoteOn);
- Add(&queue, kBrokenData1);
- Add(&queue, kGSOn);
- Add(&queue, kBrokenData2);
- Add(&queue, kTimingClock);
- Add(&queue, kBrokenData3);
- std::vector<uint8_t> message;
- queue.Get(&message);
- EXPECT_MESSAGE(kGMOn, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kNoteOn, message) << "Running status should be ignored";
- queue.Get(&message);
- EXPECT_MESSAGE(kChannelPressure, message)
- << "Running status should be ignored";
- queue.Get(&message);
- EXPECT_MESSAGE(kNoteOn, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kGSOn, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kTimingClock, message);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- }
- TEST(MidiMessageQueueTest, RunningStatusEnabled) {
- MidiMessageQueue queue(true);
- Add(&queue, kGMOn);
- Add(&queue, kBrokenData1);
- Add(&queue, kNoteOnWithRunningStatus);
- Add(&queue, kBrokenData2);
- Add(&queue, kChannelPressureWithRunningStatus);
- Add(&queue, kBrokenData3);
- Add(&queue, kNoteOn);
- Add(&queue, kBrokenData1);
- Add(&queue, kGSOn);
- Add(&queue, kBrokenData2);
- Add(&queue, kTimingClock);
- Add(&queue, kDataByte0);
- std::vector<uint8_t> message;
- queue.Get(&message);
- EXPECT_MESSAGE(kGMOn, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kNoteOn, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kNoteOn, message)
- << "Running status should be converted into a canonical MIDI message";
- queue.Get(&message);
- EXPECT_MESSAGE(kNoteOn, message)
- << "Running status should be converted into a canonical MIDI message";
- queue.Get(&message);
- EXPECT_MESSAGE(kChannelPressure, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kChannelPressure, message)
- << "Running status should be converted into a canonical MIDI message";
- queue.Get(&message);
- EXPECT_MESSAGE(kChannelPressure, message)
- << "Running status should be converted into a canonical MIDI message";
- queue.Get(&message);
- EXPECT_MESSAGE(kNoteOn, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kGSOn, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kTimingClock, message);
- queue.Get(&message);
- EXPECT_TRUE(message.empty())
- << "Running status must not be applied to real time messages";
- }
- TEST(MidiMessageQueueTest, RunningStatusEnabledWithRealTimeEvent) {
- MidiMessageQueue queue(true);
- const uint8_t kNoteOnWithRunningStatusWithTimingClock[] = {
- 0x90, 0xf8, 0x3c, 0xf8, 0x7f, 0xf8, 0x3c,
- 0xf8, 0x7f, 0xf8, 0x3c, 0xf8, 0x7f,
- };
- Add(&queue, kNoteOnWithRunningStatusWithTimingClock);
- std::vector<uint8_t> message;
- queue.Get(&message);
- EXPECT_MESSAGE(kTimingClock, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kTimingClock, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kNoteOn, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kTimingClock, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kTimingClock, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kNoteOn, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kTimingClock, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kTimingClock, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kNoteOn, message);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- }
- TEST(MidiMessageQueueTest, RunningStatusEnabledWithSystemCommonMessage) {
- MidiMessageQueue queue(true);
- const uint8_t kNoteOnWithRunningStatusWithSystemCommonMessage[] = {
- 0x90, 0x3c, 0x7f, 0xf1, 0x00, 0x3c, 0x7f, 0xf8, 0x90, 0x3c, 0x7f,
- };
- Add(&queue, kNoteOnWithRunningStatusWithSystemCommonMessage);
- std::vector<uint8_t> message;
- queue.Get(&message);
- EXPECT_MESSAGE(kNoteOn, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kMTCFrame, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kTimingClock, message) << "Running status should be reset";
- queue.Get(&message);
- EXPECT_MESSAGE(kNoteOn, message);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- }
- TEST(MidiMessageQueueTest, Issue540016) {
- const uint8_t kData[] = {0xf4, 0x3a};
- MidiMessageQueue queue(false);
- Add(&queue, kData);
- std::vector<uint8_t> message;
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- }
- TEST(MidiMessageQueueTest, ReconstructNonSysExMessage) {
- MidiMessageQueue queue(true);
- std::vector<uint8_t> message;
- Add(&queue, kPartialNoteOn1st);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kPartialNoteOn2nd);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kPartialNoteOn3rd);
- queue.Get(&message);
- EXPECT_MESSAGE(kNoteOn, message);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- }
- TEST(MidiMessageQueueTest, ReconstructBrokenNonSysExMessage) {
- MidiMessageQueue queue(true);
- std::vector<uint8_t> message;
- Add(&queue, kPartialNoteOn1st);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kPartialNoteOn2nd);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kPartialGMOn1st);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kPartialNoteOn3rd);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- }
- TEST(MidiMessageQueueTest, ReconstructSysExMessage) {
- MidiMessageQueue queue(true);
- std::vector<uint8_t> message;
- Add(&queue, kPartialGMOn1st);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kPartialGMOn2nd);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kPartialGMOn3rd);
- queue.Get(&message);
- EXPECT_MESSAGE(kGMOn, message);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- }
- TEST(MidiMessageQueueTest, ReconstructBrokenSysExMessage) {
- MidiMessageQueue queue(true);
- std::vector<uint8_t> message;
- Add(&queue, kPartialGMOn1st);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kPartialGMOn2nd);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kPartialNoteOn1st);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kPartialGMOn3rd);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- }
- TEST(MidiMessageQueueTest, OneByteMessage) {
- MidiMessageQueue queue(true);
- std::vector<uint8_t> message;
- Add(&queue, kSystemCommonMessageTuneRequest);
- Add(&queue, kSystemCommonMessageTuneRequest);
- Add(&queue, kSystemCommonMessageTuneRequest);
- Add(&queue, kSystemCommonMessageTuneRequest);
- Add(&queue, kNoteOn);
- Add(&queue, kSystemCommonMessageTuneRequest);
- Add(&queue, kNoteOn);
- Add(&queue, kNoteOn);
- Add(&queue, kSystemCommonMessageTuneRequest);
- queue.Get(&message);
- EXPECT_MESSAGE(kSystemCommonMessageTuneRequest, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kSystemCommonMessageTuneRequest, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kSystemCommonMessageTuneRequest, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kSystemCommonMessageTuneRequest, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kNoteOn, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kSystemCommonMessageTuneRequest, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kNoteOn, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kNoteOn, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kSystemCommonMessageTuneRequest, message);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- }
- TEST(MidiMessageQueueTest, OneByteMessageInjectedInNonSysExMessage) {
- MidiMessageQueue queue(true);
- std::vector<uint8_t> message;
- Add(&queue, kPartialNoteOn1st);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kPartialNoteOn2nd);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kSystemCommonMessageTuneRequest);
- queue.Get(&message);
- EXPECT_MESSAGE(kSystemCommonMessageTuneRequest, message);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kPartialNoteOn3rd);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- }
- TEST(MidiMessageQueueTest, OneByteMessageInjectedInSysExMessage) {
- MidiMessageQueue queue(true);
- std::vector<uint8_t> message;
- Add(&queue, kPartialGMOn1st);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kPartialGMOn2nd);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kSystemCommonMessageTuneRequest);
- queue.Get(&message);
- EXPECT_MESSAGE(kSystemCommonMessageTuneRequest, message);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kPartialGMOn3rd);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- }
- TEST(MidiMessageQueueTest, ReservedMessage) {
- MidiMessageQueue queue(true);
- std::vector<uint8_t> message;
- Add(&queue, kReservedMessage1);
- Add(&queue, kNoteOn);
- Add(&queue, kReservedMessage2);
- Add(&queue, kNoteOn);
- Add(&queue, kReservedMessage1WithDataBytes);
- Add(&queue, kNoteOn);
- Add(&queue, kReservedMessage2);
- Add(&queue, kReservedMessage1WithDataBytes);
- Add(&queue, kNoteOn);
- Add(&queue, kReservedMessage1WithDataBytes);
- Add(&queue, kReservedMessage2);
- Add(&queue, kNoteOn);
- queue.Get(&message);
- EXPECT_MESSAGE(kNoteOn, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kNoteOn, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kNoteOn, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kNoteOn, message);
- queue.Get(&message);
- EXPECT_MESSAGE(kNoteOn, message);
- Add(&queue, kReservedMessage1);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kNoteOn);
- queue.Get(&message);
- EXPECT_MESSAGE(kNoteOn, message);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kReservedMessage2);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kNoteOn);
- queue.Get(&message);
- EXPECT_MESSAGE(kNoteOn, message);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kReservedMessage1WithDataBytes);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kNoteOn);
- queue.Get(&message);
- EXPECT_MESSAGE(kNoteOn, message);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kReservedMessage2);
- Add(&queue, kReservedMessage1WithDataBytes);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kNoteOn);
- queue.Get(&message);
- EXPECT_MESSAGE(kNoteOn, message);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kReservedMessage1WithDataBytes);
- Add(&queue, kReservedMessage2);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kNoteOn);
- queue.Get(&message);
- EXPECT_MESSAGE(kNoteOn, message);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- }
- TEST(MidiMessageQueueTest, ReservedMessageInjectedInNonSysExMessage) {
- MidiMessageQueue queue(true);
- std::vector<uint8_t> message;
- // Inject |kReservedMessage1|
- Add(&queue, kPartialNoteOn1st);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kPartialNoteOn2nd);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kReservedMessage1);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kPartialNoteOn3rd);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- // Inject |kReservedMessage2|
- Add(&queue, kPartialNoteOn1st);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kPartialNoteOn2nd);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kReservedMessage2);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kPartialNoteOn3rd);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- // Inject |kReservedMessage1WithDataBytes|
- Add(&queue, kPartialNoteOn1st);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kPartialNoteOn2nd);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kReservedMessage1WithDataBytes);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kPartialNoteOn3rd);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- }
- TEST(MidiMessageQueueTest, ReservedMessageInjectedInSysExMessage) {
- MidiMessageQueue queue(true);
- std::vector<uint8_t> message;
- // Inject |kReservedMessage1|
- Add(&queue, kPartialGMOn1st);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kPartialGMOn2nd);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kReservedMessage1);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kPartialGMOn3rd);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- // Inject |kReservedMessage2|
- Add(&queue, kPartialGMOn1st);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kPartialGMOn2nd);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kReservedMessage2);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kPartialGMOn3rd);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- // Inject |kReservedMessage1WithDataBytes|
- Add(&queue, kPartialGMOn1st);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kPartialGMOn2nd);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kReservedMessage1WithDataBytes);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- Add(&queue, kPartialGMOn3rd);
- queue.Get(&message);
- EXPECT_TRUE(message.empty());
- }
- } // namespace
- } // namespace midi
|