2 * Copyright (C) 2012 Google Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
14 * 3. Neither the name of Google Inc. nor the names of its contributors
15 * may be used to endorse or promote products derived from this
16 * software without specific prior written permission.
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 #include "platform/mediastream/MediaStreamSource.h"
37 PassRefPtr
<MediaStreamSource
> MediaStreamSource::create(const String
& id
, Type type
, const String
& name
, bool remote
, bool readonly
, ReadyState readyState
, bool requiresConsumer
)
39 return adoptRef(new MediaStreamSource(id
, type
, name
, remote
, readonly
, readyState
, requiresConsumer
));
42 MediaStreamSource::MediaStreamSource(const String
& id
, Type type
, const String
& name
, bool remote
, bool readonly
, ReadyState readyState
, bool requiresConsumer
)
47 , m_readonly(readonly
)
48 , m_readyState(readyState
)
49 , m_requiresConsumer(requiresConsumer
)
53 void MediaStreamSource::setReadyState(ReadyState readyState
)
55 if (m_readyState
!= ReadyStateEnded
&& m_readyState
!= readyState
) {
56 m_readyState
= readyState
;
57 for (Vector
<Observer
*>::iterator i
= m_observers
.begin(); i
!= m_observers
.end(); ++i
)
58 (*i
)->sourceChangedState();
62 void MediaStreamSource::addObserver(MediaStreamSource::Observer
* observer
)
64 m_observers
.append(observer
);
67 void MediaStreamSource::removeObserver(MediaStreamSource::Observer
* observer
)
69 size_t pos
= m_observers
.find(observer
);
71 m_observers
.remove(pos
);
74 void MediaStreamSource::addAudioConsumer(AudioDestinationConsumer
* consumer
)
76 ASSERT(m_requiresConsumer
);
77 MutexLocker
locker(m_audioConsumersLock
);
78 m_audioConsumers
.add(consumer
);
81 bool MediaStreamSource::removeAudioConsumer(AudioDestinationConsumer
* consumer
)
83 ASSERT(m_requiresConsumer
);
84 MutexLocker
locker(m_audioConsumersLock
);
85 HeapHashSet
<Member
<AudioDestinationConsumer
>>::iterator it
= m_audioConsumers
.find(consumer
);
86 if (it
== m_audioConsumers
.end())
88 m_audioConsumers
.remove(it
);
92 void MediaStreamSource::setAudioFormat(size_t numberOfChannels
, float sampleRate
)
94 ASSERT(m_requiresConsumer
);
95 MutexLocker
locker(m_audioConsumersLock
);
96 for (HeapHashSet
<Member
<AudioDestinationConsumer
>>::iterator it
= m_audioConsumers
.begin(); it
!= m_audioConsumers
.end(); ++it
)
97 (*it
)->setFormat(numberOfChannels
, sampleRate
);
100 void MediaStreamSource::consumeAudio(AudioBus
* bus
, size_t numberOfFrames
)
102 ASSERT(m_requiresConsumer
);
103 MutexLocker
locker(m_audioConsumersLock
);
104 for (HeapHashSet
<Member
<AudioDestinationConsumer
>>::iterator it
= m_audioConsumers
.begin(); it
!= m_audioConsumers
.end(); ++it
)
105 (*it
)->consumeAudio(bus
, numberOfFrames
);