|  | /* | 
|  | *  Copyright 2015 The WebRTC project authors. All Rights Reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  |  | 
|  | #import "RTCAudioTrack+Private.h" | 
|  | #import "RTCMediaStreamTrack+Private.h" | 
|  | #import "RTCVideoTrack+Private.h" | 
|  |  | 
|  | #import "helpers/NSString+StdString.h" | 
|  |  | 
|  | NSString *const kRTCMediaStreamTrackKindAudio = | 
|  | @(webrtc::MediaStreamTrackInterface::kAudioKind); | 
|  | NSString *const kRTCMediaStreamTrackKindVideo = | 
|  | @(webrtc::MediaStreamTrackInterface::kVideoKind); | 
|  |  | 
|  | @implementation RTC_OBJC_TYPE (RTCMediaStreamTrack) { | 
|  | RTC_OBJC_TYPE(RTCPeerConnectionFactory) * _factory; | 
|  | rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> _nativeTrack; | 
|  | RTCMediaStreamTrackType _type; | 
|  | } | 
|  |  | 
|  | - (NSString *)kind { | 
|  | return [NSString stringForStdString:_nativeTrack->kind()]; | 
|  | } | 
|  |  | 
|  | - (NSString *)trackId { | 
|  | return [NSString stringForStdString:_nativeTrack->id()]; | 
|  | } | 
|  |  | 
|  | - (BOOL)isEnabled { | 
|  | return _nativeTrack->enabled(); | 
|  | } | 
|  |  | 
|  | - (void)setIsEnabled:(BOOL)isEnabled { | 
|  | _nativeTrack->set_enabled(isEnabled); | 
|  | } | 
|  |  | 
|  | - (RTCMediaStreamTrackState)readyState { | 
|  | return [[self class] trackStateForNativeState:_nativeTrack->state()]; | 
|  | } | 
|  |  | 
|  | - (NSString *)description { | 
|  | NSString *readyState = [[self class] stringForState:self.readyState]; | 
|  | return [NSString | 
|  | stringWithFormat:@"RTC_OBJC_TYPE(RTCMediaStreamTrack):\n%@\n%@\n%@\n%@", | 
|  | self.kind, | 
|  | self.trackId, | 
|  | self.isEnabled ? @"enabled" : @"disabled", | 
|  | readyState]; | 
|  | } | 
|  |  | 
|  | - (BOOL)isEqual:(id)object { | 
|  | if (self == object) { | 
|  | return YES; | 
|  | } | 
|  | if (![object isMemberOfClass:[self class]]) { | 
|  | return NO; | 
|  | } | 
|  | return [self isEqualToTrack:(RTC_OBJC_TYPE(RTCMediaStreamTrack) *)object]; | 
|  | } | 
|  |  | 
|  | - (NSUInteger)hash { | 
|  | return (NSUInteger)_nativeTrack.get(); | 
|  | } | 
|  |  | 
|  | #pragma mark - Private | 
|  |  | 
|  | - (rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack { | 
|  | return _nativeTrack; | 
|  | } | 
|  |  | 
|  | @synthesize factory = _factory; | 
|  |  | 
|  | - (instancetype) | 
|  | initWithFactory:(RTC_OBJC_TYPE(RTCPeerConnectionFactory) *)factory | 
|  | nativeTrack: | 
|  | (rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack | 
|  | type:(RTCMediaStreamTrackType)type { | 
|  | NSParameterAssert(nativeTrack); | 
|  | NSParameterAssert(factory); | 
|  | self = [super init]; | 
|  | if (self) { | 
|  | _factory = factory; | 
|  | _nativeTrack = nativeTrack; | 
|  | _type = type; | 
|  | } | 
|  | return self; | 
|  | } | 
|  |  | 
|  | - (instancetype) | 
|  | initWithFactory:(RTC_OBJC_TYPE(RTCPeerConnectionFactory) *)factory | 
|  | nativeTrack: | 
|  | (rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack { | 
|  | NSParameterAssert(nativeTrack); | 
|  | if (nativeTrack->kind() == | 
|  | std::string(webrtc::MediaStreamTrackInterface::kAudioKind)) { | 
|  | return [self initWithFactory:factory | 
|  | nativeTrack:nativeTrack | 
|  | type:RTCMediaStreamTrackTypeAudio]; | 
|  | } | 
|  | if (nativeTrack->kind() == | 
|  | std::string(webrtc::MediaStreamTrackInterface::kVideoKind)) { | 
|  | return [self initWithFactory:factory | 
|  | nativeTrack:nativeTrack | 
|  | type:RTCMediaStreamTrackTypeVideo]; | 
|  | } | 
|  | return nil; | 
|  | } | 
|  |  | 
|  | - (BOOL)isEqualToTrack:(RTC_OBJC_TYPE(RTCMediaStreamTrack) *)track { | 
|  | if (!track) { | 
|  | return NO; | 
|  | } | 
|  | return _nativeTrack == track.nativeTrack; | 
|  | } | 
|  |  | 
|  | + (webrtc::MediaStreamTrackInterface::TrackState)nativeTrackStateForState: | 
|  | (RTCMediaStreamTrackState)state { | 
|  | switch (state) { | 
|  | case RTCMediaStreamTrackStateLive: | 
|  | return webrtc::MediaStreamTrackInterface::kLive; | 
|  | case RTCMediaStreamTrackStateEnded: | 
|  | return webrtc::MediaStreamTrackInterface::kEnded; | 
|  | } | 
|  | } | 
|  |  | 
|  | + (RTCMediaStreamTrackState)trackStateForNativeState: | 
|  | (webrtc::MediaStreamTrackInterface::TrackState)nativeState { | 
|  | switch (nativeState) { | 
|  | case webrtc::MediaStreamTrackInterface::kLive: | 
|  | return RTCMediaStreamTrackStateLive; | 
|  | case webrtc::MediaStreamTrackInterface::kEnded: | 
|  | return RTCMediaStreamTrackStateEnded; | 
|  | } | 
|  | } | 
|  |  | 
|  | + (NSString *)stringForState:(RTCMediaStreamTrackState)state { | 
|  | switch (state) { | 
|  | case RTCMediaStreamTrackStateLive: | 
|  | return @"Live"; | 
|  | case RTCMediaStreamTrackStateEnded: | 
|  | return @"Ended"; | 
|  | } | 
|  | } | 
|  |  | 
|  | + (RTC_OBJC_TYPE(RTCMediaStreamTrack) *) | 
|  | mediaTrackForNativeTrack: | 
|  | (rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack | 
|  | factory: | 
|  | (RTC_OBJC_TYPE(RTCPeerConnectionFactory) *)factory { | 
|  | NSParameterAssert(nativeTrack); | 
|  | NSParameterAssert(factory); | 
|  | if (nativeTrack->kind() == webrtc::MediaStreamTrackInterface::kAudioKind) { | 
|  | return [[RTC_OBJC_TYPE(RTCAudioTrack) alloc] | 
|  | initWithFactory:factory | 
|  | nativeTrack:nativeTrack | 
|  | type:RTCMediaStreamTrackTypeAudio]; | 
|  | } else if (nativeTrack->kind() == | 
|  | webrtc::MediaStreamTrackInterface::kVideoKind) { | 
|  | return [[RTC_OBJC_TYPE(RTCVideoTrack) alloc] | 
|  | initWithFactory:factory | 
|  | nativeTrack:nativeTrack | 
|  | type:RTCMediaStreamTrackTypeVideo]; | 
|  | } else { | 
|  | return [[RTC_OBJC_TYPE(RTCMediaStreamTrack) alloc] | 
|  | initWithFactory:factory | 
|  | nativeTrack:nativeTrack]; | 
|  | } | 
|  | } | 
|  |  | 
|  | @end |