1*d9f75844SAndroid Build Coastguard Worker/* 2*d9f75844SAndroid Build Coastguard Worker * Copyright 2015 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker#import "RTCAudioTrack+Private.h" 12*d9f75844SAndroid Build Coastguard Worker#import "RTCMediaStreamTrack+Private.h" 13*d9f75844SAndroid Build Coastguard Worker#import "RTCVideoTrack+Private.h" 14*d9f75844SAndroid Build Coastguard Worker 15*d9f75844SAndroid Build Coastguard Worker#import "helpers/NSString+StdString.h" 16*d9f75844SAndroid Build Coastguard Worker 17*d9f75844SAndroid Build Coastguard WorkerNSString * const kRTCMediaStreamTrackKindAudio = 18*d9f75844SAndroid Build Coastguard Worker @(webrtc::MediaStreamTrackInterface::kAudioKind); 19*d9f75844SAndroid Build Coastguard WorkerNSString * const kRTCMediaStreamTrackKindVideo = 20*d9f75844SAndroid Build Coastguard Worker @(webrtc::MediaStreamTrackInterface::kVideoKind); 21*d9f75844SAndroid Build Coastguard Worker 22*d9f75844SAndroid Build Coastguard Worker@implementation RTC_OBJC_TYPE (RTCMediaStreamTrack) { 23*d9f75844SAndroid Build Coastguard Worker RTC_OBJC_TYPE(RTCPeerConnectionFactory) * _factory; 24*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> _nativeTrack; 25*d9f75844SAndroid Build Coastguard Worker RTCMediaStreamTrackType _type; 26*d9f75844SAndroid Build Coastguard Worker} 27*d9f75844SAndroid Build Coastguard Worker 28*d9f75844SAndroid Build Coastguard Worker- (NSString *)kind { 29*d9f75844SAndroid Build Coastguard Worker return [NSString stringForStdString:_nativeTrack->kind()]; 30*d9f75844SAndroid Build Coastguard Worker} 31*d9f75844SAndroid Build Coastguard Worker 32*d9f75844SAndroid Build Coastguard Worker- (NSString *)trackId { 33*d9f75844SAndroid Build Coastguard Worker return [NSString stringForStdString:_nativeTrack->id()]; 34*d9f75844SAndroid Build Coastguard Worker} 35*d9f75844SAndroid Build Coastguard Worker 36*d9f75844SAndroid Build Coastguard Worker- (BOOL)isEnabled { 37*d9f75844SAndroid Build Coastguard Worker return _nativeTrack->enabled(); 38*d9f75844SAndroid Build Coastguard Worker} 39*d9f75844SAndroid Build Coastguard Worker 40*d9f75844SAndroid Build Coastguard Worker- (void)setIsEnabled:(BOOL)isEnabled { 41*d9f75844SAndroid Build Coastguard Worker _nativeTrack->set_enabled(isEnabled); 42*d9f75844SAndroid Build Coastguard Worker} 43*d9f75844SAndroid Build Coastguard Worker 44*d9f75844SAndroid Build Coastguard Worker- (RTCMediaStreamTrackState)readyState { 45*d9f75844SAndroid Build Coastguard Worker return [[self class] trackStateForNativeState:_nativeTrack->state()]; 46*d9f75844SAndroid Build Coastguard Worker} 47*d9f75844SAndroid Build Coastguard Worker 48*d9f75844SAndroid Build Coastguard Worker- (NSString *)description { 49*d9f75844SAndroid Build Coastguard Worker NSString *readyState = [[self class] stringForState:self.readyState]; 50*d9f75844SAndroid Build Coastguard Worker return [NSString stringWithFormat:@"RTC_OBJC_TYPE(RTCMediaStreamTrack):\n%@\n%@\n%@\n%@", 51*d9f75844SAndroid Build Coastguard Worker self.kind, 52*d9f75844SAndroid Build Coastguard Worker self.trackId, 53*d9f75844SAndroid Build Coastguard Worker self.isEnabled ? @"enabled" : @"disabled", 54*d9f75844SAndroid Build Coastguard Worker readyState]; 55*d9f75844SAndroid Build Coastguard Worker} 56*d9f75844SAndroid Build Coastguard Worker 57*d9f75844SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)object { 58*d9f75844SAndroid Build Coastguard Worker if (self == object) { 59*d9f75844SAndroid Build Coastguard Worker return YES; 60*d9f75844SAndroid Build Coastguard Worker } 61*d9f75844SAndroid Build Coastguard Worker if (![object isMemberOfClass:[self class]]) { 62*d9f75844SAndroid Build Coastguard Worker return NO; 63*d9f75844SAndroid Build Coastguard Worker } 64*d9f75844SAndroid Build Coastguard Worker return [self isEqualToTrack:(RTC_OBJC_TYPE(RTCMediaStreamTrack) *)object]; 65*d9f75844SAndroid Build Coastguard Worker} 66*d9f75844SAndroid Build Coastguard Worker 67*d9f75844SAndroid Build Coastguard Worker- (NSUInteger)hash { 68*d9f75844SAndroid Build Coastguard Worker return (NSUInteger)_nativeTrack.get(); 69*d9f75844SAndroid Build Coastguard Worker} 70*d9f75844SAndroid Build Coastguard Worker 71*d9f75844SAndroid Build Coastguard Worker#pragma mark - Private 72*d9f75844SAndroid Build Coastguard Worker 73*d9f75844SAndroid Build Coastguard Worker- (rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack { 74*d9f75844SAndroid Build Coastguard Worker return _nativeTrack; 75*d9f75844SAndroid Build Coastguard Worker} 76*d9f75844SAndroid Build Coastguard Worker 77*d9f75844SAndroid Build Coastguard Worker@synthesize factory = _factory; 78*d9f75844SAndroid Build Coastguard Worker 79*d9f75844SAndroid Build Coastguard Worker- (instancetype)initWithFactory:(RTC_OBJC_TYPE(RTCPeerConnectionFactory) *)factory 80*d9f75844SAndroid Build Coastguard Worker nativeTrack:(rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack 81*d9f75844SAndroid Build Coastguard Worker type:(RTCMediaStreamTrackType)type { 82*d9f75844SAndroid Build Coastguard Worker NSParameterAssert(nativeTrack); 83*d9f75844SAndroid Build Coastguard Worker NSParameterAssert(factory); 84*d9f75844SAndroid Build Coastguard Worker if (self = [super init]) { 85*d9f75844SAndroid Build Coastguard Worker _factory = factory; 86*d9f75844SAndroid Build Coastguard Worker _nativeTrack = nativeTrack; 87*d9f75844SAndroid Build Coastguard Worker _type = type; 88*d9f75844SAndroid Build Coastguard Worker } 89*d9f75844SAndroid Build Coastguard Worker return self; 90*d9f75844SAndroid Build Coastguard Worker} 91*d9f75844SAndroid Build Coastguard Worker 92*d9f75844SAndroid Build Coastguard Worker- (instancetype)initWithFactory:(RTC_OBJC_TYPE(RTCPeerConnectionFactory) *)factory 93*d9f75844SAndroid Build Coastguard Worker nativeTrack:(rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack { 94*d9f75844SAndroid Build Coastguard Worker NSParameterAssert(nativeTrack); 95*d9f75844SAndroid Build Coastguard Worker if (nativeTrack->kind() == 96*d9f75844SAndroid Build Coastguard Worker std::string(webrtc::MediaStreamTrackInterface::kAudioKind)) { 97*d9f75844SAndroid Build Coastguard Worker return [self initWithFactory:factory nativeTrack:nativeTrack type:RTCMediaStreamTrackTypeAudio]; 98*d9f75844SAndroid Build Coastguard Worker } 99*d9f75844SAndroid Build Coastguard Worker if (nativeTrack->kind() == 100*d9f75844SAndroid Build Coastguard Worker std::string(webrtc::MediaStreamTrackInterface::kVideoKind)) { 101*d9f75844SAndroid Build Coastguard Worker return [self initWithFactory:factory nativeTrack:nativeTrack type:RTCMediaStreamTrackTypeVideo]; 102*d9f75844SAndroid Build Coastguard Worker } 103*d9f75844SAndroid Build Coastguard Worker return nil; 104*d9f75844SAndroid Build Coastguard Worker} 105*d9f75844SAndroid Build Coastguard Worker 106*d9f75844SAndroid Build Coastguard Worker- (BOOL)isEqualToTrack:(RTC_OBJC_TYPE(RTCMediaStreamTrack) *)track { 107*d9f75844SAndroid Build Coastguard Worker if (!track) { 108*d9f75844SAndroid Build Coastguard Worker return NO; 109*d9f75844SAndroid Build Coastguard Worker } 110*d9f75844SAndroid Build Coastguard Worker return _nativeTrack == track.nativeTrack; 111*d9f75844SAndroid Build Coastguard Worker} 112*d9f75844SAndroid Build Coastguard Worker 113*d9f75844SAndroid Build Coastguard Worker+ (webrtc::MediaStreamTrackInterface::TrackState)nativeTrackStateForState: 114*d9f75844SAndroid Build Coastguard Worker (RTCMediaStreamTrackState)state { 115*d9f75844SAndroid Build Coastguard Worker switch (state) { 116*d9f75844SAndroid Build Coastguard Worker case RTCMediaStreamTrackStateLive: 117*d9f75844SAndroid Build Coastguard Worker return webrtc::MediaStreamTrackInterface::kLive; 118*d9f75844SAndroid Build Coastguard Worker case RTCMediaStreamTrackStateEnded: 119*d9f75844SAndroid Build Coastguard Worker return webrtc::MediaStreamTrackInterface::kEnded; 120*d9f75844SAndroid Build Coastguard Worker } 121*d9f75844SAndroid Build Coastguard Worker} 122*d9f75844SAndroid Build Coastguard Worker 123*d9f75844SAndroid Build Coastguard Worker+ (RTCMediaStreamTrackState)trackStateForNativeState: 124*d9f75844SAndroid Build Coastguard Worker (webrtc::MediaStreamTrackInterface::TrackState)nativeState { 125*d9f75844SAndroid Build Coastguard Worker switch (nativeState) { 126*d9f75844SAndroid Build Coastguard Worker case webrtc::MediaStreamTrackInterface::kLive: 127*d9f75844SAndroid Build Coastguard Worker return RTCMediaStreamTrackStateLive; 128*d9f75844SAndroid Build Coastguard Worker case webrtc::MediaStreamTrackInterface::kEnded: 129*d9f75844SAndroid Build Coastguard Worker return RTCMediaStreamTrackStateEnded; 130*d9f75844SAndroid Build Coastguard Worker } 131*d9f75844SAndroid Build Coastguard Worker} 132*d9f75844SAndroid Build Coastguard Worker 133*d9f75844SAndroid Build Coastguard Worker+ (NSString *)stringForState:(RTCMediaStreamTrackState)state { 134*d9f75844SAndroid Build Coastguard Worker switch (state) { 135*d9f75844SAndroid Build Coastguard Worker case RTCMediaStreamTrackStateLive: 136*d9f75844SAndroid Build Coastguard Worker return @"Live"; 137*d9f75844SAndroid Build Coastguard Worker case RTCMediaStreamTrackStateEnded: 138*d9f75844SAndroid Build Coastguard Worker return @"Ended"; 139*d9f75844SAndroid Build Coastguard Worker } 140*d9f75844SAndroid Build Coastguard Worker} 141*d9f75844SAndroid Build Coastguard Worker 142*d9f75844SAndroid Build Coastguard Worker+ (RTC_OBJC_TYPE(RTCMediaStreamTrack) *) 143*d9f75844SAndroid Build Coastguard Worker mediaTrackForNativeTrack:(rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack 144*d9f75844SAndroid Build Coastguard Worker factory:(RTC_OBJC_TYPE(RTCPeerConnectionFactory) *)factory { 145*d9f75844SAndroid Build Coastguard Worker NSParameterAssert(nativeTrack); 146*d9f75844SAndroid Build Coastguard Worker NSParameterAssert(factory); 147*d9f75844SAndroid Build Coastguard Worker if (nativeTrack->kind() == webrtc::MediaStreamTrackInterface::kAudioKind) { 148*d9f75844SAndroid Build Coastguard Worker return [[RTC_OBJC_TYPE(RTCAudioTrack) alloc] initWithFactory:factory 149*d9f75844SAndroid Build Coastguard Worker nativeTrack:nativeTrack 150*d9f75844SAndroid Build Coastguard Worker type:RTCMediaStreamTrackTypeAudio]; 151*d9f75844SAndroid Build Coastguard Worker } else if (nativeTrack->kind() == webrtc::MediaStreamTrackInterface::kVideoKind) { 152*d9f75844SAndroid Build Coastguard Worker return [[RTC_OBJC_TYPE(RTCVideoTrack) alloc] initWithFactory:factory 153*d9f75844SAndroid Build Coastguard Worker nativeTrack:nativeTrack 154*d9f75844SAndroid Build Coastguard Worker type:RTCMediaStreamTrackTypeVideo]; 155*d9f75844SAndroid Build Coastguard Worker } else { 156*d9f75844SAndroid Build Coastguard Worker return [[RTC_OBJC_TYPE(RTCMediaStreamTrack) alloc] initWithFactory:factory 157*d9f75844SAndroid Build Coastguard Worker nativeTrack:nativeTrack]; 158*d9f75844SAndroid Build Coastguard Worker } 159*d9f75844SAndroid Build Coastguard Worker} 160*d9f75844SAndroid Build Coastguard Worker 161*d9f75844SAndroid Build Coastguard Worker@end 162