Commit d70a0519 authored by tzik's avatar tzik Committed by Commit Bot

Convert double-as-a-time to base::TimeTicks around timestamps in WebMIDI

WebMIDI backend implementations have used double as a time type.
As base::TimeTicks is available in Blink now, it's better fit to use
as the timestamp.

Change-Id: Ide762f3a8dd503b3bd77eae9077f5ecde18e3796
Reviewed-on: https://chromium-review.googlesource.com/892726Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Reviewed-by: default avatarKent Tamura <tkent@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Reviewed-by: default avatarTakashi Toyoshima <toyoshim@chromium.org>
Commit-Queue: Taiju Tsuiki <tzik@chromium.org>
Cr-Commit-Position: refs/heads/master@{#533988}
parent 382f6d5b
...@@ -94,7 +94,7 @@ void MidiHost::OnStartSession() { ...@@ -94,7 +94,7 @@ void MidiHost::OnStartSession() {
void MidiHost::OnSendData(uint32_t port, void MidiHost::OnSendData(uint32_t port,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp) { base::TimeTicks timestamp) {
{ {
base::AutoLock auto_lock(output_port_count_lock_); base::AutoLock auto_lock(output_port_count_lock_);
if (output_port_count_ <= port) { if (output_port_count_ <= port) {
...@@ -172,7 +172,7 @@ void MidiHost::SetOutputPortState(uint32_t port, PortState state) { ...@@ -172,7 +172,7 @@ void MidiHost::SetOutputPortState(uint32_t port, PortState state) {
void MidiHost::ReceiveMidiData(uint32_t port, void MidiHost::ReceiveMidiData(uint32_t port,
const uint8_t* data, const uint8_t* data,
size_t length, size_t length,
double timestamp) { base::TimeTicks timestamp) {
TRACE_EVENT0("midi", "MidiHost::ReceiveMidiData"); TRACE_EVENT0("midi", "MidiHost::ReceiveMidiData");
base::AutoLock auto_lock(messages_queues_lock_); base::AutoLock auto_lock(messages_queues_lock_);
......
...@@ -49,7 +49,7 @@ class CONTENT_EXPORT MidiHost : public BrowserMessageFilter, ...@@ -49,7 +49,7 @@ class CONTENT_EXPORT MidiHost : public BrowserMessageFilter,
void ReceiveMidiData(uint32_t port, void ReceiveMidiData(uint32_t port,
const uint8_t* data, const uint8_t* data,
size_t length, size_t length,
double timestamp) override; base::TimeTicks timestamp) override;
void AccumulateMidiBytesSent(size_t n) override; void AccumulateMidiBytesSent(size_t n) override;
void Detach() override; void Detach() override;
...@@ -59,7 +59,7 @@ class CONTENT_EXPORT MidiHost : public BrowserMessageFilter, ...@@ -59,7 +59,7 @@ class CONTENT_EXPORT MidiHost : public BrowserMessageFilter,
// Data to be sent to a MIDI output port. // Data to be sent to a MIDI output port.
void OnSendData(uint32_t port, void OnSendData(uint32_t port,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp); base::TimeTicks timestamp);
void OnEndSession(); void OnEndSession();
......
...@@ -34,7 +34,7 @@ struct MidiEvent { ...@@ -34,7 +34,7 @@ struct MidiEvent {
MidiEvent(MidiEventType in_type, MidiEvent(MidiEventType in_type,
uint32_t in_port_index, uint32_t in_port_index,
const std::vector<uint8_t>& in_data, const std::vector<uint8_t>& in_data,
double in_timestamp) base::TimeTicks in_timestamp)
: type(in_type), : type(in_type),
port_index(in_port_index), port_index(in_port_index),
data(in_data), data(in_data),
...@@ -43,7 +43,7 @@ struct MidiEvent { ...@@ -43,7 +43,7 @@ struct MidiEvent {
MidiEventType type; MidiEventType type;
uint32_t port_index; uint32_t port_index;
std::vector<uint8_t> data; std::vector<uint8_t> data;
double timestamp; base::TimeTicks timestamp;
}; };
class FakeMidiManager : public midi::MidiManager { class FakeMidiManager : public midi::MidiManager {
...@@ -59,7 +59,7 @@ class FakeMidiManager : public midi::MidiManager { ...@@ -59,7 +59,7 @@ class FakeMidiManager : public midi::MidiManager {
void DispatchSendMidiData(midi::MidiManagerClient* client, void DispatchSendMidiData(midi::MidiManagerClient* client,
uint32_t port_index, uint32_t port_index,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp) override { base::TimeTicks timestamp) override {
events_.push_back(MidiEvent(DISPATCH_SEND_MIDI_DATA, events_.push_back(MidiEvent(DISPATCH_SEND_MIDI_DATA,
port_index, port_index,
data, data,
...@@ -148,7 +148,7 @@ class MidiHostTest : public testing::Test { ...@@ -148,7 +148,7 @@ class MidiHostTest : public testing::Test {
void OnSendData(uint32_t port) { void OnSendData(uint32_t port) {
std::unique_ptr<IPC::Message> message( std::unique_ptr<IPC::Message> message(
new MidiHostMsg_SendData(port, data_, 0.0)); new MidiHostMsg_SendData(port, data_, base::TimeTicks()));
host_->OnMessageReceived(*message.get()); host_->OnMessageReceived(*message.get());
} }
...@@ -164,7 +164,7 @@ class MidiHostTest : public testing::Test { ...@@ -164,7 +164,7 @@ class MidiHostTest : public testing::Test {
EXPECT_EQ(DISPATCH_SEND_MIDI_DATA, manager->events_[at].type); EXPECT_EQ(DISPATCH_SEND_MIDI_DATA, manager->events_[at].type);
EXPECT_EQ(port, manager->events_[at].port_index); EXPECT_EQ(port, manager->events_[at].port_index);
EXPECT_EQ(data_, manager->events_[at].data); EXPECT_EQ(data_, manager->events_[at].data);
EXPECT_EQ(0.0, manager->events_[at].timestamp); EXPECT_EQ(base::TimeTicks(), manager->events_[at].timestamp);
} }
void RunLoopUntilIdle() { void RunLoopUntilIdle() {
......
...@@ -45,7 +45,7 @@ IPC_MESSAGE_CONTROL0(MidiHostMsg_StartSession) ...@@ -45,7 +45,7 @@ IPC_MESSAGE_CONTROL0(MidiHostMsg_StartSession)
IPC_MESSAGE_CONTROL3(MidiHostMsg_SendData, IPC_MESSAGE_CONTROL3(MidiHostMsg_SendData,
uint32_t /* port */, uint32_t /* port */,
std::vector<uint8_t> /* data */, std::vector<uint8_t> /* data */,
double /* timestamp */) base::TimeTicks /* timestamp */)
IPC_MESSAGE_CONTROL0(MidiHostMsg_EndSession) IPC_MESSAGE_CONTROL0(MidiHostMsg_EndSession)
...@@ -70,7 +70,7 @@ IPC_MESSAGE_CONTROL1(MidiMsg_SessionStarted, midi::mojom::Result /* result */) ...@@ -70,7 +70,7 @@ IPC_MESSAGE_CONTROL1(MidiMsg_SessionStarted, midi::mojom::Result /* result */)
IPC_MESSAGE_CONTROL3(MidiMsg_DataReceived, IPC_MESSAGE_CONTROL3(MidiMsg_DataReceived,
uint32_t /* port */, uint32_t /* port */,
std::vector<uint8_t> /* data */, std::vector<uint8_t> /* data */,
double /* timestamp */) base::TimeTicks /* timestamp */)
IPC_MESSAGE_CONTROL1(MidiMsg_AcknowledgeSentData, uint32_t /* bytes sent */) IPC_MESSAGE_CONTROL1(MidiMsg_AcknowledgeSentData, uint32_t /* bytes sent */)
......
...@@ -75,7 +75,7 @@ void MidiMessageFilter::RemoveClient(blink::WebMIDIAccessorClient* client) { ...@@ -75,7 +75,7 @@ void MidiMessageFilter::RemoveClient(blink::WebMIDIAccessorClient* client) {
void MidiMessageFilter::SendMidiData(uint32_t port, void MidiMessageFilter::SendMidiData(uint32_t port,
const uint8_t* data, const uint8_t* data,
size_t length, size_t length,
double timestamp) { base::TimeTicks timestamp) {
DCHECK(main_task_runner_->BelongsToCurrentThread()); DCHECK(main_task_runner_->BelongsToCurrentThread());
if ((kMaxUnacknowledgedBytesSent - unacknowledged_bytes_sent_) < length) { if ((kMaxUnacknowledgedBytesSent - unacknowledged_bytes_sent_) < length) {
// TODO(toyoshim): buffer up the data to send at a later time. // TODO(toyoshim): buffer up the data to send at a later time.
...@@ -98,7 +98,7 @@ void MidiMessageFilter::StartSessionOnIOThread() { ...@@ -98,7 +98,7 @@ void MidiMessageFilter::StartSessionOnIOThread() {
void MidiMessageFilter::SendMidiDataOnIOThread(uint32_t port, void MidiMessageFilter::SendMidiDataOnIOThread(uint32_t port,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp) { base::TimeTicks timestamp) {
DCHECK(io_task_runner_->BelongsToCurrentThread()); DCHECK(io_task_runner_->BelongsToCurrentThread());
Send(new MidiHostMsg_SendData(port, data, timestamp)); Send(new MidiHostMsg_SendData(port, data, timestamp));
} }
...@@ -189,7 +189,7 @@ void MidiMessageFilter::OnSetOutputPortState(uint32_t port, PortState state) { ...@@ -189,7 +189,7 @@ void MidiMessageFilter::OnSetOutputPortState(uint32_t port, PortState state) {
void MidiMessageFilter::OnDataReceived(uint32_t port, void MidiMessageFilter::OnDataReceived(uint32_t port,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp) { base::TimeTicks timestamp) {
TRACE_EVENT0("midi", "MidiMessageFilter::OnDataReceived"); TRACE_EVENT0("midi", "MidiMessageFilter::OnDataReceived");
DCHECK(io_task_runner_->BelongsToCurrentThread()); DCHECK(io_task_runner_->BelongsToCurrentThread());
// Handle on the main JS thread. // Handle on the main JS thread.
...@@ -260,7 +260,7 @@ void MidiMessageFilter::HandleAddOutputPort(midi::MidiPortInfo info) { ...@@ -260,7 +260,7 @@ void MidiMessageFilter::HandleAddOutputPort(midi::MidiPortInfo info) {
void MidiMessageFilter::HandleDataReceived(uint32_t port, void MidiMessageFilter::HandleDataReceived(uint32_t port,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp) { base::TimeTicks timestamp) {
TRACE_EVENT0("midi", "MidiMessageFilter::HandleDataReceived"); TRACE_EVENT0("midi", "MidiMessageFilter::HandleDataReceived");
DCHECK(main_task_runner_->BelongsToCurrentThread()); DCHECK(main_task_runner_->BelongsToCurrentThread());
DCHECK(!data.empty()); DCHECK(!data.empty());
......
...@@ -47,7 +47,7 @@ class CONTENT_EXPORT MidiMessageFilter : public IPC::MessageFilter { ...@@ -47,7 +47,7 @@ class CONTENT_EXPORT MidiMessageFilter : public IPC::MessageFilter {
void SendMidiData(uint32_t port, void SendMidiData(uint32_t port,
const uint8_t* data, const uint8_t* data,
size_t length, size_t length,
double timestamp); base::TimeTicks timestamp);
// IO task runner associated with this message filter. // IO task runner associated with this message filter.
base::SingleThreadTaskRunner* io_task_runner() const { base::SingleThreadTaskRunner* io_task_runner() const {
...@@ -62,7 +62,7 @@ class CONTENT_EXPORT MidiMessageFilter : public IPC::MessageFilter { ...@@ -62,7 +62,7 @@ class CONTENT_EXPORT MidiMessageFilter : public IPC::MessageFilter {
void SendMidiDataOnIOThread(uint32_t port, void SendMidiDataOnIOThread(uint32_t port,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp); base::TimeTicks timestamp);
void EndSessionOnIOThread(); void EndSessionOnIOThread();
...@@ -97,7 +97,7 @@ class CONTENT_EXPORT MidiMessageFilter : public IPC::MessageFilter { ...@@ -97,7 +97,7 @@ class CONTENT_EXPORT MidiMessageFilter : public IPC::MessageFilter {
// more messages. // more messages.
void OnDataReceived(uint32_t port, void OnDataReceived(uint32_t port,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp); base::TimeTicks timestamp);
// From time-to-time, the browser incrementally informs us of how many bytes // From time-to-time, the browser incrementally informs us of how many bytes
// it has successfully sent. This is part of our throttling process to avoid // it has successfully sent. This is part of our throttling process to avoid
...@@ -114,7 +114,7 @@ class CONTENT_EXPORT MidiMessageFilter : public IPC::MessageFilter { ...@@ -114,7 +114,7 @@ class CONTENT_EXPORT MidiMessageFilter : public IPC::MessageFilter {
void HandleDataReceived(uint32_t port, void HandleDataReceived(uint32_t port,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp); base::TimeTicks timestamp);
void HandleAckknowledgeSentData(size_t bytes_sent); void HandleAckknowledgeSentData(size_t bytes_sent);
......
...@@ -29,7 +29,7 @@ void RendererWebMIDIAccessorImpl::StartSession() { ...@@ -29,7 +29,7 @@ void RendererWebMIDIAccessorImpl::StartSession() {
void RendererWebMIDIAccessorImpl::SendMIDIData(unsigned port_index, void RendererWebMIDIAccessorImpl::SendMIDIData(unsigned port_index,
const unsigned char* data, const unsigned char* data,
size_t length, size_t length,
double timestamp) { base::TimeTicks timestamp) {
midi_message_filter()->SendMidiData( midi_message_filter()->SendMidiData(
port_index, port_index,
data, data,
......
...@@ -28,7 +28,7 @@ class RendererWebMIDIAccessorImpl ...@@ -28,7 +28,7 @@ class RendererWebMIDIAccessorImpl
void SendMIDIData(unsigned port_index, void SendMIDIData(unsigned port_index,
const unsigned char* data, const unsigned char* data,
size_t length, size_t length,
double timestamp) override; base::TimeTicks timestamp) override;
private: private:
blink::WebMIDIAccessorClient* client_; blink::WebMIDIAccessorClient* client_;
......
...@@ -61,7 +61,7 @@ void MockWebMIDIAccessor::StartSession() { ...@@ -61,7 +61,7 @@ void MockWebMIDIAccessor::StartSession() {
void MockWebMIDIAccessor::SendMIDIData(unsigned port_index, void MockWebMIDIAccessor::SendMIDIData(unsigned port_index,
const unsigned char* data, const unsigned char* data,
size_t length, size_t length,
double timestamp) { base::TimeTicks timestamp) {
// Emulate a loopback device for testing. Make sure if an input port that has // Emulate a loopback device for testing. Make sure if an input port that has
// the same index exists. // the same index exists.
if (port_index < next_input_port_index_) if (port_index < next_input_port_index_)
......
...@@ -31,7 +31,7 @@ class MockWebMIDIAccessor : public blink::WebMIDIAccessor { ...@@ -31,7 +31,7 @@ class MockWebMIDIAccessor : public blink::WebMIDIAccessor {
void SendMIDIData(unsigned port_index, void SendMIDIData(unsigned port_index,
const unsigned char* data, const unsigned char* data,
size_t length, size_t length,
double timestamp) override; base::TimeTicks timestamp) override;
private: private:
void addInputPort(midi::mojom::PortState state); void addInputPort(midi::mojom::PortState state);
......
...@@ -201,7 +201,7 @@ void MidiManager::AccumulateMidiBytesSent(MidiManagerClient* client, size_t n) { ...@@ -201,7 +201,7 @@ void MidiManager::AccumulateMidiBytesSent(MidiManagerClient* client, size_t n) {
void MidiManager::DispatchSendMidiData(MidiManagerClient* client, void MidiManager::DispatchSendMidiData(MidiManagerClient* client,
uint32_t port_index, uint32_t port_index,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp) { base::TimeTicks timestamp) {
NOTREACHED(); NOTREACHED();
} }
...@@ -263,7 +263,7 @@ void MidiManager::SetOutputPortState(uint32_t port_index, PortState state) { ...@@ -263,7 +263,7 @@ void MidiManager::SetOutputPortState(uint32_t port_index, PortState state) {
void MidiManager::ReceiveMidiData(uint32_t port_index, void MidiManager::ReceiveMidiData(uint32_t port_index,
const uint8_t* data, const uint8_t* data,
size_t length, size_t length,
double timestamp) { base::TimeTicks timestamp) {
base::AutoLock auto_lock(lock_); base::AutoLock auto_lock(lock_);
data_received_ = true; data_received_ = true;
......
...@@ -61,7 +61,7 @@ class MIDI_EXPORT MidiManagerClient { ...@@ -61,7 +61,7 @@ class MIDI_EXPORT MidiManagerClient {
virtual void ReceiveMidiData(uint32_t port_index, virtual void ReceiveMidiData(uint32_t port_index,
const uint8_t* data, const uint8_t* data,
size_t length, size_t length,
double timestamp) = 0; base::TimeTicks timestamp) = 0;
// AccumulateMidiBytesSent() is called to acknowledge when bytes have // AccumulateMidiBytesSent() is called to acknowledge when bytes have
// successfully been sent to the hardware. // successfully been sent to the hardware.
...@@ -118,13 +118,13 @@ class MIDI_EXPORT MidiManager { ...@@ -118,13 +118,13 @@ class MIDI_EXPORT MidiManager {
// |port_index| represents the specific output port from output_ports(). // |port_index| represents the specific output port from output_ports().
// |data| represents a series of bytes encoding one or more MIDI messages. // |data| represents a series of bytes encoding one or more MIDI messages.
// |length| is the number of bytes in |data|. // |length| is the number of bytes in |data|.
// |timestamp| is the time to send the data, in seconds. A value of 0 // |timestamp| is the time to send the data. A value of 0 means send "now" or
// means send "now" or as soon as possible. // as soon as possible. The default implementation is for unsupported
// The default implementation is for unsupported platforms. // platforms.
virtual void DispatchSendMidiData(MidiManagerClient* client, virtual void DispatchSendMidiData(MidiManagerClient* client,
uint32_t port_index, uint32_t port_index,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp); base::TimeTicks timestamp);
protected: protected:
friend class MidiManagerUsb; friend class MidiManagerUsb;
...@@ -158,20 +158,10 @@ class MIDI_EXPORT MidiManager { ...@@ -158,20 +158,10 @@ class MIDI_EXPORT MidiManager {
void SetOutputPortState(uint32_t port_index, mojom::PortState state); void SetOutputPortState(uint32_t port_index, mojom::PortState state);
// Dispatches to all clients. // Dispatches to all clients.
// TODO(toyoshim): Fix the mac implementation to use
// |ReceiveMidiData(..., base::TimeTicks)|.
void ReceiveMidiData(uint32_t port_index, void ReceiveMidiData(uint32_t port_index,
const uint8_t* data, const uint8_t* data,
size_t length, size_t length,
double timestamp); base::TimeTicks time);
void ReceiveMidiData(uint32_t port_index,
const uint8_t* data,
size_t length,
base::TimeTicks time) {
ReceiveMidiData(port_index, data, length,
(time - base::TimeTicks()).InSecondsF());
}
size_t clients_size_for_testing() const { return clients_.size(); } size_t clients_size_for_testing() const { return clients_.size(); }
size_t pending_clients_size_for_testing() const { size_t pending_clients_size_for_testing() const {
......
...@@ -319,7 +319,7 @@ void MidiManagerAlsa::Finalize() { ...@@ -319,7 +319,7 @@ void MidiManagerAlsa::Finalize() {
void MidiManagerAlsa::DispatchSendMidiData(MidiManagerClient* client, void MidiManagerAlsa::DispatchSendMidiData(MidiManagerClient* client,
uint32_t port_index, uint32_t port_index,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp) { base::TimeTicks timestamp) {
service()->task_service()->PostBoundDelayedTask( service()->task_service()->PostBoundDelayedTask(
kSendTaskRunner, kSendTaskRunner,
base::BindOnce(&MidiManagerAlsa::SendMidiData, base::Unretained(this), base::BindOnce(&MidiManagerAlsa::SendMidiData, base::Unretained(this),
...@@ -884,8 +884,7 @@ void MidiManagerAlsa::EventLoop() { ...@@ -884,8 +884,7 @@ void MidiManagerAlsa::EventLoop() {
if (pfd[0].revents & POLLIN) { if (pfd[0].revents & POLLIN) {
// Read available incoming MIDI data. // Read available incoming MIDI data.
int remaining; int remaining;
double timestamp = base::TimeTicks timestamp = base::TimeTicks::Now();
(base::TimeTicks::Now() - base::TimeTicks()).InSecondsF();
do { do {
snd_seq_event_t* event; snd_seq_event_t* event;
err = snd_seq_event_input(in_client_.get(), &event); err = snd_seq_event_input(in_client_.get(), &event);
...@@ -952,7 +951,7 @@ void MidiManagerAlsa::EventLoop() { ...@@ -952,7 +951,7 @@ void MidiManagerAlsa::EventLoop() {
} }
void MidiManagerAlsa::ProcessSingleEvent(snd_seq_event_t* event, void MidiManagerAlsa::ProcessSingleEvent(snd_seq_event_t* event,
double timestamp) { base::TimeTicks timestamp) {
auto source_it = auto source_it =
source_map_.find(AddrToInt(event->source.client, event->source.port)); source_map_.find(AddrToInt(event->source.client, event->source.port));
if (source_it != source_map_.end()) { if (source_it != source_map_.end()) {
......
...@@ -36,7 +36,7 @@ class MIDI_EXPORT MidiManagerAlsa final : public MidiManager { ...@@ -36,7 +36,7 @@ class MIDI_EXPORT MidiManagerAlsa final : public MidiManager {
void DispatchSendMidiData(MidiManagerClient* client, void DispatchSendMidiData(MidiManagerClient* client,
uint32_t port_index, uint32_t port_index,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp) override; base::TimeTicks timestamp) override;
private: private:
friend class MidiManagerAlsaTest; friend class MidiManagerAlsaTest;
...@@ -374,7 +374,7 @@ class MIDI_EXPORT MidiManagerAlsa final : public MidiManager { ...@@ -374,7 +374,7 @@ class MIDI_EXPORT MidiManagerAlsa final : public MidiManager {
const std::vector<uint8_t>& data); const std::vector<uint8_t>& data);
void EventLoop(); void EventLoop();
void ProcessSingleEvent(snd_seq_event_t* event, double timestamp); void ProcessSingleEvent(snd_seq_event_t* event, base::TimeTicks timestamp);
void ProcessClientStartEvent(int client_id); void ProcessClientStartEvent(int client_id);
void ProcessPortStartEvent(const snd_seq_addr_t& addr); void ProcessPortStartEvent(const snd_seq_addr_t& addr);
void ProcessClientExitEvent(const snd_seq_addr_t& addr); void ProcessClientExitEvent(const snd_seq_addr_t& addr);
......
...@@ -91,7 +91,7 @@ void MidiManagerAndroid::Finalize() { ...@@ -91,7 +91,7 @@ void MidiManagerAndroid::Finalize() {
void MidiManagerAndroid::DispatchSendMidiData(MidiManagerClient* client, void MidiManagerAndroid::DispatchSendMidiData(MidiManagerClient* client,
uint32_t port_index, uint32_t port_index,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp) { base::TimeTicks timestamp) {
if (port_index >= all_output_ports_.size()) { if (port_index >= all_output_ports_.size()) {
// |port_index| is provided by a renderer so we can't believe that it is // |port_index| is provided by a renderer so we can't believe that it is
// in the valid range. // in the valid range.
......
...@@ -39,7 +39,7 @@ class MidiManagerAndroid final : public MidiManager, ...@@ -39,7 +39,7 @@ class MidiManagerAndroid final : public MidiManager,
void DispatchSendMidiData(MidiManagerClient* client, void DispatchSendMidiData(MidiManagerClient* client,
uint32_t port_index, uint32_t port_index,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp) override; base::TimeTicks timestamp) override;
// MidiInputPortAndroid::Delegate implementation. // MidiInputPortAndroid::Delegate implementation.
void OnReceivedData(MidiInputPortAndroid*, void OnReceivedData(MidiInputPortAndroid*,
......
...@@ -101,14 +101,13 @@ MidiPortInfo GetPortInfoFromEndpoint(MIDIEndpointRef endpoint) { ...@@ -101,14 +101,13 @@ MidiPortInfo GetPortInfoFromEndpoint(MIDIEndpointRef endpoint) {
return MidiPortInfo(id, manufacturer, name, version, state); return MidiPortInfo(id, manufacturer, name, version, state);
} }
double MIDITimeStampToSeconds(MIDITimeStamp timestamp) { base::TimeTicks MIDITimeStampToTimeTicks(MIDITimeStamp timestamp) {
UInt64 nanoseconds = AudioConvertHostTimeToNanos(timestamp); UInt64 nanoseconds = AudioConvertHostTimeToNanos(timestamp);
return static_cast<double>(nanoseconds) / 1.0e9; return base::TimeTicks() + base::TimeDelta::FromNanoseconds(nanoseconds);
} }
MIDITimeStamp SecondsToMIDITimeStamp(double seconds) { MIDITimeStamp TimeTicksToMIDITimeStamp(base::TimeTicks ticks) {
UInt64 nanos = UInt64(seconds * 1.0e9); return AudioConvertNanosToHostTime(ticks.since_origin().InNanoseconds());
return AudioConvertNanosToHostTime(nanos);
} }
} // namespace } // namespace
...@@ -147,7 +146,7 @@ void MidiManagerMac::Finalize() { ...@@ -147,7 +146,7 @@ void MidiManagerMac::Finalize() {
void MidiManagerMac::DispatchSendMidiData(MidiManagerClient* client, void MidiManagerMac::DispatchSendMidiData(MidiManagerClient* client,
uint32_t port_index, uint32_t port_index,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp) { base::TimeTicks timestamp) {
service()->task_service()->PostBoundTask( service()->task_service()->PostBoundTask(
kClientTaskRunner, kClientTaskRunner,
base::BindOnce(&MidiManagerMac::SendMidiData, base::Unretained(this), base::BindOnce(&MidiManagerMac::SendMidiData, base::Unretained(this),
...@@ -298,10 +297,10 @@ void MidiManagerMac::ReadMidiDispatch(const MIDIPacketList* packet_list, ...@@ -298,10 +297,10 @@ void MidiManagerMac::ReadMidiDispatch(const MIDIPacketList* packet_list,
const MIDIPacket* packet = &packet_list->packet[0]; const MIDIPacket* packet = &packet_list->packet[0];
for (size_t i = 0u; i < packet_list->numPackets; i++) { for (size_t i = 0u; i < packet_list->numPackets; i++) {
// Each packet contains MIDI data for one or more messages (like note-on). // Each packet contains MIDI data for one or more messages (like note-on).
double timestamp_seconds = MIDITimeStampToSeconds(packet->timeStamp); base::TimeTicks timestamp = MIDITimeStampToTimeTicks(packet->timeStamp);
manager->ReceiveMidiData(port_index, packet->data, packet->length, manager->ReceiveMidiData(port_index, packet->data, packet->length,
timestamp_seconds); timestamp);
packet = MIDIPacketNext(packet); packet = MIDIPacketNext(packet);
} }
...@@ -310,13 +309,13 @@ void MidiManagerMac::ReadMidiDispatch(const MIDIPacketList* packet_list, ...@@ -310,13 +309,13 @@ void MidiManagerMac::ReadMidiDispatch(const MIDIPacketList* packet_list,
void MidiManagerMac::SendMidiData(MidiManagerClient* client, void MidiManagerMac::SendMidiData(MidiManagerClient* client,
uint32_t port_index, uint32_t port_index,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp) { base::TimeTicks timestamp) {
DCHECK(service()->task_service()->IsOnTaskRunner(kClientTaskRunner)); DCHECK(service()->task_service()->IsOnTaskRunner(kClientTaskRunner));
// Lookup the destination based on the port index. // Lookup the destination based on the port index.
if (static_cast<size_t>(port_index) >= destinations_.size()) if (static_cast<size_t>(port_index) >= destinations_.size())
return; return;
MIDITimeStamp coremidi_timestamp = SecondsToMIDITimeStamp(timestamp); MIDITimeStamp coremidi_timestamp = TimeTicksToMIDITimeStamp(timestamp);
MIDIEndpointRef destination = destinations_[port_index]; MIDIEndpointRef destination = destinations_[port_index];
size_t send_size; size_t send_size;
......
...@@ -33,7 +33,7 @@ class MIDI_EXPORT MidiManagerMac final : public MidiManager { ...@@ -33,7 +33,7 @@ class MIDI_EXPORT MidiManagerMac final : public MidiManager {
void DispatchSendMidiData(MidiManagerClient* client, void DispatchSendMidiData(MidiManagerClient* client,
uint32_t port_index, uint32_t port_index,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp) override; base::TimeTicks timestamp) override;
private: private:
// Initializes CoreMIDI on |client_thread_| asynchronously. Called from // Initializes CoreMIDI on |client_thread_| asynchronously. Called from
...@@ -57,7 +57,7 @@ class MIDI_EXPORT MidiManagerMac final : public MidiManager { ...@@ -57,7 +57,7 @@ class MIDI_EXPORT MidiManagerMac final : public MidiManager {
void SendMidiData(MidiManagerClient* client, void SendMidiData(MidiManagerClient* client,
uint32_t port_index, uint32_t port_index,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp); base::TimeTicks timestamp);
// CoreMIDI client reference, should be protected by |midi_client_lock_|. // CoreMIDI client reference, should be protected by |midi_client_lock_|.
MIDIClientRef midi_client_ = 0; MIDIClientRef midi_client_ = 0;
......
...@@ -68,7 +68,7 @@ class FakeMidiManagerClient : public MidiManagerClient { ...@@ -68,7 +68,7 @@ class FakeMidiManagerClient : public MidiManagerClient {
void ReceiveMidiData(uint32_t port_index, void ReceiveMidiData(uint32_t port_index,
const uint8_t* data, const uint8_t* data,
size_t size, size_t size,
double timestamp) override {} base::TimeTicks timestamp) override {}
void AccumulateMidiBytesSent(size_t size) override {} void AccumulateMidiBytesSent(size_t size) override {}
void Detach() override {} void Detach() override {}
......
...@@ -52,7 +52,7 @@ class FakeMidiManager : public MidiManager { ...@@ -52,7 +52,7 @@ class FakeMidiManager : public MidiManager {
void DispatchSendMidiData(MidiManagerClient* client, void DispatchSendMidiData(MidiManagerClient* client,
uint32_t port_index, uint32_t port_index,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp) override {} base::TimeTicks timestamp) override {}
// Utility functions for testing. // Utility functions for testing.
void CallCompleteInitialization(Result result) { void CallCompleteInitialization(Result result) {
...@@ -131,7 +131,7 @@ class FakeMidiManagerClient : public MidiManagerClient { ...@@ -131,7 +131,7 @@ class FakeMidiManagerClient : public MidiManagerClient {
void ReceiveMidiData(uint32_t port_index, void ReceiveMidiData(uint32_t port_index,
const uint8_t* data, const uint8_t* data,
size_t size, size_t size,
double timestamp) override {} base::TimeTicks timestamp) override {}
void AccumulateMidiBytesSent(size_t size) override {} void AccumulateMidiBytesSent(size_t size) override {}
void Detach() override {} void Detach() override {}
......
...@@ -72,7 +72,7 @@ void MidiManagerUsb::Initialize(Callback callback) { ...@@ -72,7 +72,7 @@ void MidiManagerUsb::Initialize(Callback callback) {
void MidiManagerUsb::DispatchSendMidiData(MidiManagerClient* client, void MidiManagerUsb::DispatchSendMidiData(MidiManagerClient* client,
uint32_t port_index, uint32_t port_index,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp) { base::TimeTicks timestamp) {
if (port_index >= output_streams_.size()) { if (port_index >= output_streams_.size()) {
// |port_index| is provided by a renderer so we can't believe that it is // |port_index| is provided by a renderer so we can't believe that it is
// in the valid range. // in the valid range.
......
...@@ -45,7 +45,7 @@ class USB_MIDI_EXPORT MidiManagerUsb : public MidiManager, ...@@ -45,7 +45,7 @@ class USB_MIDI_EXPORT MidiManagerUsb : public MidiManager,
void DispatchSendMidiData(MidiManagerClient* client, void DispatchSendMidiData(MidiManagerClient* client,
uint32_t port_index, uint32_t port_index,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp) override; base::TimeTicks timestamp) override;
// UsbMidiDeviceDelegate implementation. // UsbMidiDeviceDelegate implementation.
void ReceiveUsbMidiData(UsbMidiDevice* device, void ReceiveUsbMidiData(UsbMidiDevice* device,
......
...@@ -123,7 +123,7 @@ class FakeMidiManagerClient : public MidiManagerClient { ...@@ -123,7 +123,7 @@ class FakeMidiManagerClient : public MidiManagerClient {
void ReceiveMidiData(uint32_t port_index, void ReceiveMidiData(uint32_t port_index,
const uint8_t* data, const uint8_t* data,
size_t size, size_t size,
double timestamp) override { base::TimeTicks timestamp) override {
logger_->AddLog("MidiManagerClient::ReceiveMidiData "); logger_->AddLog("MidiManagerClient::ReceiveMidiData ");
logger_->AddLog( logger_->AddLog(
base::StringPrintf("usb:port_index = %d data =", port_index)); base::StringPrintf("usb:port_index = %d data =", port_index));
...@@ -460,7 +460,8 @@ TEST_F(MidiManagerUsbTest, Send) { ...@@ -460,7 +460,8 @@ TEST_F(MidiManagerUsbTest, Send) {
EXPECT_EQ(Result::OK, GetInitializationResult()); EXPECT_EQ(Result::OK, GetInitializationResult());
ASSERT_EQ(2u, manager()->output_streams().size()); ASSERT_EQ(2u, manager()->output_streams().size());
manager()->DispatchSendMidiData(client_.get(), 1, ToVector(data), 0); manager()->DispatchSendMidiData(client_.get(), 1, ToVector(data),
base::TimeTicks());
// Since UsbMidiDevice::Send is posted as a task, RunLoop should run to // Since UsbMidiDevice::Send is posted as a task, RunLoop should run to
// invoke the task. // invoke the task.
base::RunLoop run_loop; base::RunLoop run_loop;
...@@ -506,11 +507,13 @@ TEST_F(MidiManagerUsbTest, SendFromCompromizedRenderer) { ...@@ -506,11 +507,13 @@ TEST_F(MidiManagerUsbTest, SendFromCompromizedRenderer) {
EXPECT_EQ("UsbMidiDevice::GetDescriptors\n", logger_.TakeLog()); EXPECT_EQ("UsbMidiDevice::GetDescriptors\n", logger_.TakeLog());
// The specified port index is invalid. The manager must ignore the request. // The specified port index is invalid. The manager must ignore the request.
manager()->DispatchSendMidiData(client_.get(), 99, ToVector(data), 0); manager()->DispatchSendMidiData(client_.get(), 99, ToVector(data),
base::TimeTicks());
EXPECT_EQ("", logger_.TakeLog()); EXPECT_EQ("", logger_.TakeLog());
// The specified port index is invalid. The manager must ignore the request. // The specified port index is invalid. The manager must ignore the request.
manager()->DispatchSendMidiData(client_.get(), 2, ToVector(data), 0); manager()->DispatchSendMidiData(client_.get(), 2, ToVector(data),
base::TimeTicks());
EXPECT_EQ("", logger_.TakeLog()); EXPECT_EQ("", logger_.TakeLog());
} }
......
...@@ -751,7 +751,7 @@ void MidiManagerWin::Finalize() { ...@@ -751,7 +751,7 @@ void MidiManagerWin::Finalize() {
void MidiManagerWin::DispatchSendMidiData(MidiManagerClient* client, void MidiManagerWin::DispatchSendMidiData(MidiManagerClient* client,
uint32_t port_index, uint32_t port_index,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp) { base::TimeTicks timestamp) {
PostDelayedTask( PostDelayedTask(
base::BindOnce(&MidiManagerWin::SendOnTaskRunner, base::Unretained(this), base::BindOnce(&MidiManagerWin::SendOnTaskRunner, base::Unretained(this),
client, port_index, data), client, port_index, data),
......
...@@ -41,7 +41,7 @@ class MidiManagerWin final ...@@ -41,7 +41,7 @@ class MidiManagerWin final
void DispatchSendMidiData(MidiManagerClient* client, void DispatchSendMidiData(MidiManagerClient* client,
uint32_t port_index, uint32_t port_index,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp) override; base::TimeTicks timestamp) override;
// base::SystemMonitor::DevicesChangedObserver overrides: // base::SystemMonitor::DevicesChangedObserver overrides:
void OnDevicesChanged(base::SystemMonitor::DeviceType device_type) override; void OnDevicesChanged(base::SystemMonitor::DeviceType device_type) override;
......
...@@ -802,7 +802,7 @@ void MidiManagerWinrt::Finalize() { ...@@ -802,7 +802,7 @@ void MidiManagerWinrt::Finalize() {
void MidiManagerWinrt::DispatchSendMidiData(MidiManagerClient* client, void MidiManagerWinrt::DispatchSendMidiData(MidiManagerClient* client,
uint32_t port_index, uint32_t port_index,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp) { base::TimeTicks timestamp) {
base::TimeDelta delay = MidiService::TimestampToTimeDeltaDelay(timestamp); base::TimeDelta delay = MidiService::TimestampToTimeDeltaDelay(timestamp);
service()->task_service()->PostBoundDelayedTask( service()->task_service()->PostBoundDelayedTask(
kComTaskRunner, kComTaskRunner,
......
...@@ -28,7 +28,7 @@ class MIDI_EXPORT MidiManagerWinrt final : public MidiManager { ...@@ -28,7 +28,7 @@ class MIDI_EXPORT MidiManagerWinrt final : public MidiManager {
void DispatchSendMidiData(MidiManagerClient* client, void DispatchSendMidiData(MidiManagerClient* client,
uint32_t port_index, uint32_t port_index,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp) final; base::TimeTicks timestamp) final;
private: private:
// Subclasses that access private/protected members of MidiManager. // Subclasses that access private/protected members of MidiManager.
......
...@@ -19,15 +19,11 @@ std::unique_ptr<MidiManager> MidiService::ManagerFactory::Create( ...@@ -19,15 +19,11 @@ std::unique_ptr<MidiManager> MidiService::ManagerFactory::Create(
} }
// static // static
base::TimeDelta MidiService::TimestampToTimeDeltaDelay(double timestamp) { base::TimeDelta MidiService::TimestampToTimeDeltaDelay(
base::TimeDelta delay; base::TimeTicks timestamp) {
if (timestamp != 0.0) { if (timestamp.is_null())
base::TimeTicks time_to_send = return base::TimeDelta();
base::TimeTicks() + base::TimeDelta::FromMicroseconds( return std::max(timestamp - base::TimeTicks::Now(), base::TimeDelta());
timestamp * base::Time::kMicrosecondsPerSecond);
delay = std::max(time_to_send - base::TimeTicks::Now(), base::TimeDelta());
}
return delay;
} }
MidiService::MidiService() : MidiService(std::make_unique<ManagerFactory>()) {} MidiService::MidiService() : MidiService(std::make_unique<ManagerFactory>()) {}
...@@ -95,7 +91,7 @@ bool MidiService::EndSession(MidiManagerClient* client) { ...@@ -95,7 +91,7 @@ bool MidiService::EndSession(MidiManagerClient* client) {
void MidiService::DispatchSendMidiData(MidiManagerClient* client, void MidiService::DispatchSendMidiData(MidiManagerClient* client,
uint32_t port_index, uint32_t port_index,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp) { base::TimeTicks timestamp) {
base::AutoLock lock(lock_); base::AutoLock lock(lock_);
// MidiService needs to consider invalid DispatchSendMidiData calls without // MidiService needs to consider invalid DispatchSendMidiData calls without
......
...@@ -37,8 +37,8 @@ class MIDI_EXPORT MidiService final { ...@@ -37,8 +37,8 @@ class MIDI_EXPORT MidiService final {
DISALLOW_COPY_AND_ASSIGN(ManagerFactory); DISALLOW_COPY_AND_ASSIGN(ManagerFactory);
}; };
// Converts Web MIDI timestamp to base::TimeDelta dealy for PostDelayedTask. // Converts Web MIDI timestamp to base::TimeDelta delay for PostDelayedTask.
static base::TimeDelta TimestampToTimeDeltaDelay(double timestamp); static base::TimeDelta TimestampToTimeDeltaDelay(base::TimeTicks timestamp);
MidiService(); MidiService();
// Customized ManagerFactory can be specified in the constructor for testing. // Customized ManagerFactory can be specified in the constructor for testing.
...@@ -60,7 +60,7 @@ class MIDI_EXPORT MidiService final { ...@@ -60,7 +60,7 @@ class MIDI_EXPORT MidiService final {
void DispatchSendMidiData(MidiManagerClient* client, void DispatchSendMidiData(MidiManagerClient* client,
uint32_t port_index, uint32_t port_index,
const std::vector<uint8_t>& data, const std::vector<uint8_t>& data,
double timestamp); base::TimeTicks timestamp);
// Returns a SingleThreadTaskRunner reference to serve MidiManager. Each // Returns a SingleThreadTaskRunner reference to serve MidiManager. Each
// TaskRunner will be constructed on demand. // TaskRunner will be constructed on demand.
......
...@@ -185,7 +185,7 @@ void MIDIAccess::DidSetOutputPortState(unsigned port_index, PortState state) { ...@@ -185,7 +185,7 @@ void MIDIAccess::DidSetOutputPortState(unsigned port_index, PortState state) {
void MIDIAccess::DidReceiveMIDIData(unsigned port_index, void MIDIAccess::DidReceiveMIDIData(unsigned port_index,
const unsigned char* data, const unsigned char* data,
size_t length, size_t length,
double time_stamp) { TimeTicks time_stamp) {
DCHECK(IsMainThread()); DCHECK(IsMainThread());
if (port_index >= inputs_.size()) if (port_index >= inputs_.size())
return; return;
...@@ -196,33 +196,12 @@ void MIDIAccess::DidReceiveMIDIData(unsigned port_index, ...@@ -196,33 +196,12 @@ void MIDIAccess::DidReceiveMIDIData(unsigned port_index,
void MIDIAccess::SendMIDIData(unsigned port_index, void MIDIAccess::SendMIDIData(unsigned port_index,
const unsigned char* data, const unsigned char* data,
size_t length, size_t length,
double time_stamp_in_milliseconds) { TimeTicks time_stamp) {
// Do not continue sending when document is going to be closed. DCHECK(!time_stamp.is_null());
Document* document = ToDocument(GetExecutionContext()); if (!GetExecutionContext() || !data || !length ||
DCHECK(document); port_index >= outputs_.size())
DocumentLoader* loader = document->Loader();
if (!loader)
return; return;
if (!data || !length || port_index >= outputs_.size())
return;
// Convert from a time in milliseconds (a DOMHighResTimeStamp) according to
// the same time coordinate system as performance.now() into a time in seconds
// which is based on the time coordinate system of
// monotonicallyIncreasingTime().
double time_stamp;
if (!time_stamp_in_milliseconds) {
// We treat a value of 0 (which is the default value) as special, meaning
// "now". We need to translate it exactly to 0 seconds.
time_stamp = 0;
} else {
double document_start_time =
TimeTicksInSeconds(loader->GetTiming().ReferenceMonotonicTime());
time_stamp = document_start_time + 0.001 * time_stamp_in_milliseconds;
}
accessor_->SendMIDIData(port_index, data, length, time_stamp); accessor_->SendMIDIData(port_index, data, length, time_stamp);
} }
......
...@@ -115,14 +115,14 @@ class MIDIAccess final : public EventTargetWithInlineData, ...@@ -115,14 +115,14 @@ class MIDIAccess final : public EventTargetWithInlineData,
void DidReceiveMIDIData(unsigned port_index, void DidReceiveMIDIData(unsigned port_index,
const unsigned char* data, const unsigned char* data,
size_t length, size_t length,
double time_stamp) override; TimeTicks time_stamp) override;
// |timeStampInMilliseconds| is in the same time coordinate system as // |timeStampInMilliseconds| is in the same time coordinate system as
// performance.now(). // performance.now().
void SendMIDIData(unsigned port_index, void SendMIDIData(unsigned port_index,
const unsigned char* data, const unsigned char* data,
size_t length, size_t length,
double time_stamp_in_milliseconds); TimeTicks time_stamp);
// Eager finalization needed to promptly release m_accessor. Otherwise // Eager finalization needed to promptly release m_accessor. Otherwise
// its client back reference could end up being unsafely used during // its client back reference could end up being unsafely used during
......
...@@ -82,7 +82,7 @@ class MODULES_EXPORT MIDIAccessInitializer : public ScriptPromiseResolver, ...@@ -82,7 +82,7 @@ class MODULES_EXPORT MIDIAccessInitializer : public ScriptPromiseResolver,
void DidReceiveMIDIData(unsigned port_index, void DidReceiveMIDIData(unsigned port_index,
const unsigned char* data, const unsigned char* data,
size_t length, size_t length,
double time_stamp) override {} TimeTicks time_stamp) override {}
private: private:
MIDIAccessInitializer(ScriptState*, const MIDIOptions&); MIDIAccessInitializer(ScriptState*, const MIDIOptions&);
......
...@@ -64,7 +64,7 @@ void MIDIAccessor::StartSession() { ...@@ -64,7 +64,7 @@ void MIDIAccessor::StartSession() {
void MIDIAccessor::SendMIDIData(unsigned port_index, void MIDIAccessor::SendMIDIData(unsigned port_index,
const unsigned char* data, const unsigned char* data,
size_t length, size_t length,
double time_stamp) { base::TimeTicks time_stamp) {
accessor_->SendMIDIData(port_index, data, length, time_stamp); accessor_->SendMIDIData(port_index, data, length, time_stamp);
} }
...@@ -99,7 +99,7 @@ void MIDIAccessor::DidStartSession(Result result) { ...@@ -99,7 +99,7 @@ void MIDIAccessor::DidStartSession(Result result) {
void MIDIAccessor::DidReceiveMIDIData(unsigned port_index, void MIDIAccessor::DidReceiveMIDIData(unsigned port_index,
const unsigned char* data, const unsigned char* data,
size_t length, size_t length,
double time_stamp) { base::TimeTicks time_stamp) {
client_->DidReceiveMIDIData(port_index, data, length, time_stamp); client_->DidReceiveMIDIData(port_index, data, length, time_stamp);
} }
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#define MIDIAccessor_h #define MIDIAccessor_h
#include <memory> #include <memory>
#include "base/time/time.h"
#include "media/midi/midi_service.mojom-blink.h" #include "media/midi/midi_service.mojom-blink.h"
#include "platform/wtf/Allocator.h" #include "platform/wtf/Allocator.h"
#include "public/platform/modules/webmidi/WebMIDIAccessor.h" #include "public/platform/modules/webmidi/WebMIDIAccessor.h"
...@@ -53,7 +54,7 @@ class MIDIAccessor final : public WebMIDIAccessorClient { ...@@ -53,7 +54,7 @@ class MIDIAccessor final : public WebMIDIAccessorClient {
void SendMIDIData(unsigned port_index, void SendMIDIData(unsigned port_index,
const unsigned char* data, const unsigned char* data,
size_t length, size_t length,
double time_stamp); base::TimeTicks time_stamp);
// MIDIAccessInitializer and MIDIAccess are both MIDIAccessClient. // MIDIAccessInitializer and MIDIAccess are both MIDIAccessClient.
// MIDIAccessInitializer is the first client and MIDIAccess takes over it // MIDIAccessInitializer is the first client and MIDIAccess takes over it
// once the initialization successfully finishes. // once the initialization successfully finishes.
...@@ -78,7 +79,7 @@ class MIDIAccessor final : public WebMIDIAccessorClient { ...@@ -78,7 +79,7 @@ class MIDIAccessor final : public WebMIDIAccessorClient {
void DidReceiveMIDIData(unsigned port_index, void DidReceiveMIDIData(unsigned port_index,
const unsigned char* data, const unsigned char* data,
size_t length, size_t length,
double time_stamp) override; base::TimeTicks time_stamp) override;
private: private:
explicit MIDIAccessor(MIDIAccessorClient*); explicit MIDIAccessor(MIDIAccessorClient*);
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#ifndef MIDIAccessorClient_h #ifndef MIDIAccessorClient_h
#define MIDIAccessorClient_h #define MIDIAccessorClient_h
#include "base/time/time.h"
#include "media/midi/midi_service.mojom-blink.h" #include "media/midi/midi_service.mojom-blink.h"
#include "modules/webmidi/MIDIAccessor.h" #include "modules/webmidi/MIDIAccessor.h"
#include "platform/wtf/Forward.h" #include "platform/wtf/Forward.h"
...@@ -58,7 +59,7 @@ class MIDIAccessorClient { ...@@ -58,7 +59,7 @@ class MIDIAccessorClient {
virtual void DidReceiveMIDIData(unsigned port_index, virtual void DidReceiveMIDIData(unsigned port_index,
const unsigned char* data, const unsigned char* data,
size_t length, size_t length,
double time_stamp) = 0; base::TimeTicks time_stamp) = 0;
}; };
} // namespace blink } // namespace blink
......
...@@ -83,7 +83,7 @@ void MIDIInput::AddedEventListener( ...@@ -83,7 +83,7 @@ void MIDIInput::AddedEventListener(
void MIDIInput::DidReceiveMIDIData(unsigned port_index, void MIDIInput::DidReceiveMIDIData(unsigned port_index,
const unsigned char* data, const unsigned char* data,
size_t length, size_t length,
double time_stamp) { base::TimeTicks time_stamp) {
DCHECK(IsMainThread()); DCHECK(IsMainThread());
if (!length) if (!length)
......
...@@ -60,12 +60,10 @@ class MIDIInput final : public MIDIPort { ...@@ -60,12 +60,10 @@ class MIDIInput final : public MIDIPort {
return EventTargetNames::MIDIInput; return EventTargetNames::MIDIInput;
} }
// |timeStamp| is a DOMHighResTimeStamp in the time coordinate system of
// performance.now().
void DidReceiveMIDIData(unsigned port_index, void DidReceiveMIDIData(unsigned port_index,
const unsigned char* data, const unsigned char* data,
size_t length, size_t length,
double time_stamp); base::TimeTicks time_stamp);
virtual void Trace(blink::Visitor*); virtual void Trace(blink::Visitor*);
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#ifndef MIDIMessageEvent_h #ifndef MIDIMessageEvent_h
#define MIDIMessageEvent_h #define MIDIMessageEvent_h
#include "base/time/time.h"
#include "core/typed_arrays/DOMTypedArray.h" #include "core/typed_arrays/DOMTypedArray.h"
#include "modules/EventModules.h" #include "modules/EventModules.h"
...@@ -42,7 +43,8 @@ class MIDIMessageEvent final : public Event { ...@@ -42,7 +43,8 @@ class MIDIMessageEvent final : public Event {
DEFINE_WRAPPERTYPEINFO(); DEFINE_WRAPPERTYPEINFO();
public: public:
static MIDIMessageEvent* Create(double time_stamp, DOMUint8Array* data) { static MIDIMessageEvent* Create(base::TimeTicks time_stamp,
DOMUint8Array* data) {
return new MIDIMessageEvent(time_stamp, data); return new MIDIMessageEvent(time_stamp, data);
} }
...@@ -63,11 +65,8 @@ class MIDIMessageEvent final : public Event { ...@@ -63,11 +65,8 @@ class MIDIMessageEvent final : public Event {
} }
private: private:
MIDIMessageEvent(double time_stamp, DOMUint8Array* data) MIDIMessageEvent(base::TimeTicks time_stamp, DOMUint8Array* data)
: Event(EventTypeNames::midimessage, : Event(EventTypeNames::midimessage, true, false, time_stamp),
true,
false,
TimeTicks() + TimeDelta::FromSecondsD(time_stamp)),
data_(data) {} data_(data) {}
MIDIMessageEvent(const AtomicString& type, MIDIMessageEvent(const AtomicString& type,
......
...@@ -66,7 +66,7 @@ DOMUint8Array* ConvertUnsignedDataToUint8Array( ...@@ -66,7 +66,7 @@ DOMUint8Array* ConvertUnsignedDataToUint8Array(
return array; return array;
} }
double GetTimeOrigin(ExecutionContext* context) { base::TimeTicks GetTimeOrigin(ExecutionContext* context) {
DCHECK(context); DCHECK(context);
PerformanceBase* performance = nullptr; PerformanceBase* performance = nullptr;
if (LocalDOMWindow* window = context->ExecutingWindow()) { if (LocalDOMWindow* window = context->ExecutingWindow()) {
...@@ -78,7 +78,8 @@ double GetTimeOrigin(ExecutionContext* context) { ...@@ -78,7 +78,8 @@ double GetTimeOrigin(ExecutionContext* context) {
} }
DCHECK(performance); DCHECK(performance);
return performance->timeOrigin(); return base::TimeTicks() +
TimeDelta::FromMillisecondsD(performance->timeOrigin());
} }
class MessageValidator { class MessageValidator {
...@@ -257,11 +258,12 @@ void MIDIOutput::send(NotShared<DOMUint8Array> array, ...@@ -257,11 +258,12 @@ void MIDIOutput::send(NotShared<DOMUint8Array> array,
if (!context) if (!context)
return; return;
double timestamp; base::TimeTicks timestamp;
if (timestamp_in_milliseconds == 0.0) { if (timestamp_in_milliseconds == 0.0) {
timestamp = CurrentTimeTicksInMilliseconds(); timestamp = base::TimeTicks::Now();
} else { } else {
timestamp = GetTimeOrigin(context) + timestamp_in_milliseconds; timestamp = GetTimeOrigin(context) +
base::TimeDelta::FromMillisecondsD(timestamp_in_milliseconds);
} }
SendInternal(array.View(), timestamp, exception_state); SendInternal(array.View(), timestamp, exception_state);
} }
...@@ -289,7 +291,7 @@ void MIDIOutput::send(NotShared<DOMUint8Array> data, ...@@ -289,7 +291,7 @@ void MIDIOutput::send(NotShared<DOMUint8Array> data,
return; return;
DCHECK(data); DCHECK(data);
SendInternal(data.View(), CurrentTimeTicksInMilliseconds(), exception_state); SendInternal(data.View(), base::TimeTicks::Now(), exception_state);
} }
void MIDIOutput::send(Vector<unsigned> unsigned_data, void MIDIOutput::send(Vector<unsigned> unsigned_data,
...@@ -304,7 +306,7 @@ void MIDIOutput::send(Vector<unsigned> unsigned_data, ...@@ -304,7 +306,7 @@ void MIDIOutput::send(Vector<unsigned> unsigned_data,
return; return;
} }
SendInternal(array, CurrentTimeTicksInMilliseconds(), exception_state); SendInternal(array, base::TimeTicks::Now(), exception_state);
} }
void MIDIOutput::DidOpen(bool opened) { void MIDIOutput::DidOpen(bool opened) {
...@@ -327,11 +329,11 @@ void MIDIOutput::Trace(blink::Visitor* visitor) { ...@@ -327,11 +329,11 @@ void MIDIOutput::Trace(blink::Visitor* visitor) {
} }
void MIDIOutput::SendInternal(DOMUint8Array* array, void MIDIOutput::SendInternal(DOMUint8Array* array,
double platform_timestamp, base::TimeTicks timestamp,
ExceptionState& exception_state) { ExceptionState& exception_state) {
DCHECK(GetExecutionContext()); DCHECK(GetExecutionContext());
DCHECK(array); DCHECK(array);
DCHECK_NE(0.0, platform_timestamp); DCHECK(!timestamp.is_null());
UseCounter::Count(GetExecutionContext(), WebFeature::kMIDIOutputSend); UseCounter::Count(GetExecutionContext(), WebFeature::kMIDIOutputSend);
// Implicit open. It does nothing if the port is already opened. // Implicit open. It does nothing if the port is already opened.
...@@ -343,10 +345,10 @@ void MIDIOutput::SendInternal(DOMUint8Array* array, ...@@ -343,10 +345,10 @@ void MIDIOutput::SendInternal(DOMUint8Array* array,
return; return;
if (IsOpening()) { if (IsOpening()) {
pending_data_.emplace_back(array, platform_timestamp); pending_data_.emplace_back(array, timestamp);
} else { } else {
midiAccess()->SendMIDIData(port_index_, array->Data(), array->length(), midiAccess()->SendMIDIData(port_index_, array->Data(), array->length(),
platform_timestamp); timestamp);
} }
} }
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#define MIDIOutput_h #define MIDIOutput_h
#include <utility> #include <utility>
#include "base/time/time.h"
#include "core/typed_arrays/ArrayBufferViewHelpers.h" #include "core/typed_arrays/ArrayBufferViewHelpers.h"
#include "core/typed_arrays/DOMTypedArray.h" #include "core/typed_arrays/DOMTypedArray.h"
#include "modules/webmidi/MIDIPort.h" #include "modules/webmidi/MIDIPort.h"
...@@ -74,10 +75,10 @@ class MIDIOutput final : public MIDIPort { ...@@ -74,10 +75,10 @@ class MIDIOutput final : public MIDIPort {
midi::mojom::PortState); midi::mojom::PortState);
void DidOpen(bool opened) override; void DidOpen(bool opened) override;
void SendInternal(DOMUint8Array*, double platform_timestamp, ExceptionState&); void SendInternal(DOMUint8Array*, base::TimeTicks timestamp, ExceptionState&);
unsigned port_index_; unsigned port_index_;
HeapDeque<std::pair<Member<DOMUint8Array>, double>> pending_data_; HeapDeque<std::pair<Member<DOMUint8Array>, base::TimeTicks>> pending_data_;
}; };
} // namespace blink } // namespace blink
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#ifndef WebMIDIAccessor_h #ifndef WebMIDIAccessor_h
#define WebMIDIAccessor_h #define WebMIDIAccessor_h
#include "base/time/time.h"
#include "public/platform/WebString.h" #include "public/platform/WebString.h"
namespace blink { namespace blink {
...@@ -45,7 +46,7 @@ class WebMIDIAccessor { ...@@ -45,7 +46,7 @@ class WebMIDIAccessor {
virtual void SendMIDIData(unsigned port_index, virtual void SendMIDIData(unsigned port_index,
const unsigned char* data, const unsigned char* data,
size_t length, size_t length,
double time_stamp) {} base::TimeTicks time_stamp) {}
virtual void Clear(unsigned port_index) {} virtual void Clear(unsigned port_index) {}
virtual void Close(unsigned port_index) {} virtual void Close(unsigned port_index) {}
}; };
......
...@@ -63,7 +63,7 @@ class WebMIDIAccessorClient { ...@@ -63,7 +63,7 @@ class WebMIDIAccessorClient {
virtual void DidReceiveMIDIData(unsigned port_index, virtual void DidReceiveMIDIData(unsigned port_index,
const unsigned char* data, const unsigned char* data,
size_t length, size_t length,
double time_stamp) = 0; base::TimeTicks time_stamp) = 0;
protected: protected:
virtual ~WebMIDIAccessorClient() = default; virtual ~WebMIDIAccessorClient() = default;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment