1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/renderer/media/cast_ipc_dispatcher.h"
7 #include "chrome/common/cast_messages.h"
8 #include "chrome/renderer/media/cast_transport_sender_ipc.h"
9 #include "ipc/ipc_message_macros.h"
11 CastIPCDispatcher
* CastIPCDispatcher::global_instance_
= NULL
;
13 CastIPCDispatcher::CastIPCDispatcher(
14 const scoped_refptr
<base::MessageLoopProxy
>& io_message_loop
)
16 io_message_loop_(io_message_loop
) {
17 DCHECK(io_message_loop_
);
18 DCHECK(!global_instance_
);
21 CastIPCDispatcher::~CastIPCDispatcher() {
22 DCHECK(io_message_loop_
->BelongsToCurrentThread());
23 // Unfortunately, you do not always get a OnFilterRemoved call.
24 global_instance_
= NULL
;
27 CastIPCDispatcher
* CastIPCDispatcher::Get() {
28 return global_instance_
;
31 void CastIPCDispatcher::Send(IPC::Message
* message
) {
32 DCHECK(io_message_loop_
->BelongsToCurrentThread());
34 channel_
->Send(message
);
40 int32
CastIPCDispatcher::AddSender(CastTransportSenderIPC
* sender
) {
41 return id_map_
.Add(sender
);
44 void CastIPCDispatcher::RemoveSender(int32 channel_id
) {
45 return id_map_
.Remove(channel_id
);
48 bool CastIPCDispatcher::OnMessageReceived(const IPC::Message
& message
) {
49 DCHECK(io_message_loop_
->BelongsToCurrentThread());
51 IPC_BEGIN_MESSAGE_MAP(CastIPCDispatcher
, message
)
52 IPC_MESSAGE_HANDLER(CastMsg_ReceivedPacket
, OnReceivedPacket
)
53 IPC_MESSAGE_HANDLER(CastMsg_NotifyStatusChange
, OnNotifyStatusChange
)
54 IPC_MESSAGE_HANDLER(CastMsg_RtpStatistics
, OnRtpStatistics
)
55 IPC_MESSAGE_UNHANDLED(handled
= false);
56 IPC_END_MESSAGE_MAP();
60 void CastIPCDispatcher::OnFilterAdded(IPC::Channel
* channel
) {
61 DCHECK(io_message_loop_
->BelongsToCurrentThread());
62 DCHECK(!global_instance_
);
63 global_instance_
= this;
67 void CastIPCDispatcher::OnFilterRemoved() {
68 DCHECK(io_message_loop_
->BelongsToCurrentThread());
69 DCHECK_EQ(this, global_instance_
);
70 global_instance_
= NULL
;
74 void CastIPCDispatcher::OnChannelClosing() {
75 DCHECK(io_message_loop_
->BelongsToCurrentThread());
76 DCHECK_EQ(this, global_instance_
);
80 void CastIPCDispatcher::OnReceivedPacket(
82 const media::cast::transport::Packet
& packet
) {
83 CastTransportSenderIPC
* sender
= id_map_
.Lookup(channel_id
);
85 sender
->OnReceivedPacket(packet
);
87 LOG(ERROR
) << "CastIPCDispatcher::OnReceivedPacket "
88 << "on non-existing channel.";
92 void CastIPCDispatcher::OnNotifyStatusChange(
94 media::cast::transport::CastTransportStatus status
) {
95 CastTransportSenderIPC
* sender
= id_map_
.Lookup(channel_id
);
97 sender
->OnNotifyStatusChange(status
);
100 << "CastIPCDispatcher::OnNotifystatusChange on non-existing channel.";
104 void CastIPCDispatcher::OnRtpStatistics(
107 const media::cast::transport::RtcpSenderInfo
& sender_info
,
108 base::TimeTicks time_sent
,
109 uint32 rtp_timestamp
) {
110 CastTransportSenderIPC
* sender
= id_map_
.Lookup(channel_id
);
112 sender
->OnRtpStatistics(audio
, sender_info
, time_sent
, rtp_timestamp
);
115 << "CastIPCDispatcher::OnNotifystatusChange on non-existing channel.";