| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/midi/midi_manager_winrt.h" | 5 #include "media/midi/midi_manager_winrt.h" |
| 6 | 6 |
| 7 #pragma warning(disable : 4467) | 7 #pragma warning(disable : 4467) |
| 8 | 8 |
| 9 #include <initguid.h> // Required by <devpkey.h> | 9 #include <initguid.h> // Required by <devpkey.h> |
| 10 | 10 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 namespace { | 35 namespace { |
| 36 | 36 |
| 37 namespace WRL = Microsoft::WRL; | 37 namespace WRL = Microsoft::WRL; |
| 38 | 38 |
| 39 using namespace ABI::Windows::Devices::Enumeration; | 39 using namespace ABI::Windows::Devices::Enumeration; |
| 40 using namespace ABI::Windows::Devices::Midi; | 40 using namespace ABI::Windows::Devices::Midi; |
| 41 using namespace ABI::Windows::Foundation; | 41 using namespace ABI::Windows::Foundation; |
| 42 using namespace ABI::Windows::Storage::Streams; | 42 using namespace ABI::Windows::Storage::Streams; |
| 43 | 43 |
| 44 using base::win::ScopedComPtr; | 44 using base::win::ScopedComPtr; |
| 45 using mojom::PortState; |
| 45 using mojom::Result; | 46 using mojom::Result; |
| 46 | 47 |
| 47 // Helpers for printing HRESULTs. | 48 // Helpers for printing HRESULTs. |
| 48 struct PrintHr { | 49 struct PrintHr { |
| 49 PrintHr(HRESULT hr) : hr(hr) {} | 50 PrintHr(HRESULT hr) : hr(hr) {} |
| 50 HRESULT hr; | 51 HRESULT hr; |
| 51 }; | 52 }; |
| 52 | 53 |
| 53 std::ostream& operator<<(std::ostream& os, const PrintHr& phr) { | 54 std::ostream& operator<<(std::ostream& os, const PrintHr& phr) { |
| 54 std::ios_base::fmtflags ff = os.flags(); | 55 std::ios_base::fmtflags ff = os.flags(); |
| (...skipping 587 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 642 CHECK(is_initialized_); | 643 CHECK(is_initialized_); |
| 643 | 644 |
| 644 // Note: in case Microsoft GS Wavetable Synth triggers this event for some | 645 // Note: in case Microsoft GS Wavetable Synth triggers this event for some |
| 645 // reason, it will be ignored here with log emitted. | 646 // reason, it will be ignored here with log emitted. |
| 646 MidiPort<InterfaceType>* port = GetPortByDeviceId(dev_id); | 647 MidiPort<InterfaceType>* port = GetPortByDeviceId(dev_id); |
| 647 if (!port) { | 648 if (!port) { |
| 648 VLOG(1) << "Removing non-existent port " << dev_id; | 649 VLOG(1) << "Removing non-existent port " << dev_id; |
| 649 return; | 650 return; |
| 650 } | 651 } |
| 651 | 652 |
| 652 SetPortState(port->index, MIDI_PORT_DISCONNECTED); | 653 SetPortState(port->index, PortState::DISCONNECTED); |
| 653 | 654 |
| 654 RemovePortEventHandlers(port); | 655 RemovePortEventHandlers(port); |
| 655 port->handle = nullptr; | 656 port->handle = nullptr; |
| 656 } | 657 } |
| 657 | 658 |
| 658 void OnCompletedGetPortFromIdAsync(IAsyncOperation<RuntimeType*>* async_op) { | 659 void OnCompletedGetPortFromIdAsync(IAsyncOperation<RuntimeType*>* async_op) { |
| 659 DCHECK(thread_checker_.CalledOnValidThread()); | 660 DCHECK(thread_checker_.CalledOnValidThread()); |
| 660 CHECK(is_initialized_); | 661 CHECK(is_initialized_); |
| 661 | 662 |
| 662 InterfaceType* handle = nullptr; | 663 InterfaceType* handle = nullptr; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 684 | 685 |
| 685 std::string dev_id = GetDeviceIdString(handle); | 686 std::string dev_id = GetDeviceIdString(handle); |
| 686 | 687 |
| 687 MidiPort<InterfaceType>* port = GetPortByDeviceId(dev_id); | 688 MidiPort<InterfaceType>* port = GetPortByDeviceId(dev_id); |
| 688 | 689 |
| 689 if (port == nullptr) { | 690 if (port == nullptr) { |
| 690 std::string manufacturer = "Unknown", driver_version = "Unknown"; | 691 std::string manufacturer = "Unknown", driver_version = "Unknown"; |
| 691 GetDriverInfoFromDeviceId(dev_id, &manufacturer, &driver_version); | 692 GetDriverInfoFromDeviceId(dev_id, &manufacturer, &driver_version); |
| 692 | 693 |
| 693 AddPort(MidiPortInfo(dev_id, manufacturer, port_names_[dev_id], | 694 AddPort(MidiPortInfo(dev_id, manufacturer, port_names_[dev_id], |
| 694 driver_version, MIDI_PORT_OPENED)); | 695 driver_version, PortState::OPENED)); |
| 695 | 696 |
| 696 port = new MidiPort<InterfaceType>; | 697 port = new MidiPort<InterfaceType>; |
| 697 port->index = static_cast<uint32_t>(port_ids_.size()); | 698 port->index = static_cast<uint32_t>(port_ids_.size()); |
| 698 | 699 |
| 699 ports_[dev_id].reset(port); | 700 ports_[dev_id].reset(port); |
| 700 port_ids_.push_back(dev_id); | 701 port_ids_.push_back(dev_id); |
| 701 } else { | 702 } else { |
| 702 SetPortState(port->index, MIDI_PORT_CONNECTED); | 703 SetPortState(port->index, PortState::CONNECTED); |
| 703 } | 704 } |
| 704 | 705 |
| 705 port->handle = handle; | 706 port->handle = handle; |
| 706 port->token_MessageReceived = token; | 707 port->token_MessageReceived = token; |
| 707 | 708 |
| 708 if (enumeration_completed_not_ready_ && async_ops_.empty()) { | 709 if (enumeration_completed_not_ready_ && async_ops_.empty()) { |
| 709 midi_manager_->OnPortManagerReady(); | 710 midi_manager_->OnPortManagerReady(); |
| 710 enumeration_completed_not_ready_ = false; | 711 enumeration_completed_not_ready_ = false; |
| 711 } | 712 } |
| 712 } | 713 } |
| 713 | 714 |
| 714 // Overrided by MidiInPortManager to listen to input ports. | 715 // Overrided by MidiInPortManager to listen to input ports. |
| 715 virtual bool RegisterOnMessageReceived(InterfaceType* handle, | 716 virtual bool RegisterOnMessageReceived(InterfaceType* handle, |
| 716 EventRegistrationToken* p_token) { | 717 EventRegistrationToken* p_token) { |
| 717 return true; | 718 return true; |
| 718 } | 719 } |
| 719 | 720 |
| 720 // Overrided by MidiInPortManager to remove MessageReceived event handler. | 721 // Overrided by MidiInPortManager to remove MessageReceived event handler. |
| 721 virtual void RemovePortEventHandlers(MidiPort<InterfaceType>* port) {} | 722 virtual void RemovePortEventHandlers(MidiPort<InterfaceType>* port) {} |
| 722 | 723 |
| 723 // Calls midi_manager_->Add{Input,Output}Port. | 724 // Calls midi_manager_->Add{Input,Output}Port. |
| 724 virtual void AddPort(MidiPortInfo info) = 0; | 725 virtual void AddPort(MidiPortInfo info) = 0; |
| 725 | 726 |
| 726 // Calls midi_manager_->Set{Input,Output}PortState. | 727 // Calls midi_manager_->Set{Input,Output}PortState. |
| 727 virtual void SetPortState(uint32_t port_index, MidiPortState state) = 0; | 728 virtual void SetPortState(uint32_t port_index, PortState state) = 0; |
| 728 | 729 |
| 729 // WeakPtrFactory has to be declared in derived class, use this method to | 730 // WeakPtrFactory has to be declared in derived class, use this method to |
| 730 // retrieve upcasted WeakPtr for posting tasks. | 731 // retrieve upcasted WeakPtr for posting tasks. |
| 731 virtual base::WeakPtr<MidiPortManager> GetWeakPtrFromFactory() = 0; | 732 virtual base::WeakPtr<MidiPortManager> GetWeakPtrFromFactory() = 0; |
| 732 | 733 |
| 733 // Midi{In,Out}PortStatics instance. | 734 // Midi{In,Out}PortStatics instance. |
| 734 ScopedComPtr<StaticsInterfaceType> midi_port_statics_; | 735 ScopedComPtr<StaticsInterfaceType> midi_port_statics_; |
| 735 | 736 |
| 736 // DeviceWatcher instance and event registration tokens for unsubscribing | 737 // DeviceWatcher instance and event registration tokens for unsubscribing |
| 737 // events in destructor. | 738 // events in destructor. |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 842 return; | 843 return; |
| 843 | 844 |
| 844 HRESULT hr = | 845 HRESULT hr = |
| 845 port->handle->remove_MessageReceived(port->token_MessageReceived); | 846 port->handle->remove_MessageReceived(port->token_MessageReceived); |
| 846 VLOG_IF(1, FAILED(hr)) << "remove_MessageReceived failed: " << PrintHr(hr); | 847 VLOG_IF(1, FAILED(hr)) << "remove_MessageReceived failed: " << PrintHr(hr); |
| 847 port->token_MessageReceived.value = kInvalidTokenValue; | 848 port->token_MessageReceived.value = kInvalidTokenValue; |
| 848 } | 849 } |
| 849 | 850 |
| 850 void AddPort(MidiPortInfo info) final { midi_manager_->AddInputPort(info); } | 851 void AddPort(MidiPortInfo info) final { midi_manager_->AddInputPort(info); } |
| 851 | 852 |
| 852 void SetPortState(uint32_t port_index, MidiPortState state) final { | 853 void SetPortState(uint32_t port_index, PortState state) final { |
| 853 midi_manager_->SetInputPortState(port_index, state); | 854 midi_manager_->SetInputPortState(port_index, state); |
| 854 } | 855 } |
| 855 | 856 |
| 856 base::WeakPtr<MidiPortManager> GetWeakPtrFromFactory() final { | 857 base::WeakPtr<MidiPortManager> GetWeakPtrFromFactory() final { |
| 857 DCHECK(thread_checker_.CalledOnValidThread()); | 858 DCHECK(thread_checker_.CalledOnValidThread()); |
| 858 | 859 |
| 859 return weak_factory_.GetWeakPtr(); | 860 return weak_factory_.GetWeakPtr(); |
| 860 } | 861 } |
| 861 | 862 |
| 862 // Callback on receiving MIDI input message. | 863 // Callback on receiving MIDI input message. |
| (...skipping 20 matching lines...) Expand all Loading... |
| 883 IMidiOutPortStatics, | 884 IMidiOutPortStatics, |
| 884 RuntimeClass_Windows_Devices_Midi_MidiOutPort> { | 885 RuntimeClass_Windows_Devices_Midi_MidiOutPort> { |
| 885 public: | 886 public: |
| 886 MidiOutPortManager(MidiManagerWinrt* midi_manager) | 887 MidiOutPortManager(MidiManagerWinrt* midi_manager) |
| 887 : MidiPortManager(midi_manager), weak_factory_(this) {} | 888 : MidiPortManager(midi_manager), weak_factory_(this) {} |
| 888 | 889 |
| 889 private: | 890 private: |
| 890 // MidiPortManager overrides: | 891 // MidiPortManager overrides: |
| 891 void AddPort(MidiPortInfo info) final { midi_manager_->AddOutputPort(info); } | 892 void AddPort(MidiPortInfo info) final { midi_manager_->AddOutputPort(info); } |
| 892 | 893 |
| 893 void SetPortState(uint32_t port_index, MidiPortState state) final { | 894 void SetPortState(uint32_t port_index, PortState state) final { |
| 894 midi_manager_->SetOutputPortState(port_index, state); | 895 midi_manager_->SetOutputPortState(port_index, state); |
| 895 } | 896 } |
| 896 | 897 |
| 897 base::WeakPtr<MidiPortManager> GetWeakPtrFromFactory() final { | 898 base::WeakPtr<MidiPortManager> GetWeakPtrFromFactory() final { |
| 898 DCHECK(thread_checker_.CalledOnValidThread()); | 899 DCHECK(thread_checker_.CalledOnValidThread()); |
| 899 | 900 |
| 900 return weak_factory_.GetWeakPtr(); | 901 return weak_factory_.GetWeakPtr(); |
| 901 } | 902 } |
| 902 | 903 |
| 903 // Last member to ensure destructed first. | 904 // Last member to ensure destructed first. |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1039 | 1040 |
| 1040 void MidiManagerWinrt::OnPortManagerReady() { | 1041 void MidiManagerWinrt::OnPortManagerReady() { |
| 1041 DCHECK(com_thread_checker_->CalledOnValidThread()); | 1042 DCHECK(com_thread_checker_->CalledOnValidThread()); |
| 1042 DCHECK(port_manager_ready_count_ < 2); | 1043 DCHECK(port_manager_ready_count_ < 2); |
| 1043 | 1044 |
| 1044 if (++port_manager_ready_count_ == 2) | 1045 if (++port_manager_ready_count_ == 2) |
| 1045 CompleteInitialization(Result::OK); | 1046 CompleteInitialization(Result::OK); |
| 1046 } | 1047 } |
| 1047 | 1048 |
| 1048 } // namespace midi | 1049 } // namespace midi |
| OLD | NEW |