blob: 5c1b5a39ab5a20f238b3a6c74652ac0de1d3be75 [file] [log] [blame]
Jon Hjelle81028792016-01-11 13:16:13 -08001/*
2 * Copyright 2015 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Yura Yaroshevich415920b2018-02-22 13:55:22 +030011#import "RTCAudioTrack+Private.h"
tkchin9eeb6242016-04-27 01:54:20 -070012#import "RTCMediaStreamTrack+Private.h"
Yura Yaroshevich415920b2018-02-22 13:55:22 +030013#import "RTCVideoTrack+Private.h"
Jon Hjelle81028792016-01-11 13:16:13 -080014
tkchin9eeb6242016-04-27 01:54:20 -070015#import "NSString+StdString.h"
Jon Hjelle81028792016-01-11 13:16:13 -080016
skvladf3569c82016-04-29 15:30:16 -070017NSString * const kRTCMediaStreamTrackKindAudio =
18 @(webrtc::MediaStreamTrackInterface::kAudioKind);
19NSString * const kRTCMediaStreamTrackKindVideo =
20 @(webrtc::MediaStreamTrackInterface::kVideoKind);
21
Jon Hjelle81028792016-01-11 13:16:13 -080022@implementation RTCMediaStreamTrack {
23 rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> _nativeTrack;
Jon Hjelleca91e382016-01-21 15:36:47 -080024 RTCMediaStreamTrackType _type;
Jon Hjelle81028792016-01-11 13:16:13 -080025}
26
27- (NSString *)kind {
28 return [NSString stringForStdString:_nativeTrack->kind()];
29}
30
31- (NSString *)trackId {
32 return [NSString stringForStdString:_nativeTrack->id()];
33}
34
35- (BOOL)isEnabled {
36 return _nativeTrack->enabled();
37}
38
39- (void)setIsEnabled:(BOOL)isEnabled {
40 _nativeTrack->set_enabled(isEnabled);
41}
42
43- (RTCMediaStreamTrackState)readyState {
44 return [[self class] trackStateForNativeState:_nativeTrack->state()];
45}
46
47- (NSString *)description {
48 NSString *readyState = [[self class] stringForState:self.readyState];
49 return [NSString stringWithFormat:@"RTCMediaStreamTrack:\n%@\n%@\n%@\n%@",
50 self.kind,
51 self.trackId,
52 self.isEnabled ? @"enabled" : @"disabled",
53 readyState];
54}
55
skvlad79b4b872016-04-08 17:28:55 -070056- (BOOL)isEqual:(id)object {
57 if (self == object) {
58 return YES;
59 }
60 if (![object isMemberOfClass:[self class]]) {
61 return NO;
62 }
63 return [self isEqualToTrack:(RTCMediaStreamTrack *)object];
64}
65
66- (NSUInteger)hash {
67 return (NSUInteger)_nativeTrack.get();
68}
69
Jon Hjelle81028792016-01-11 13:16:13 -080070#pragma mark - Private
71
72- (rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack {
73 return _nativeTrack;
74}
75
76- (instancetype)initWithNativeTrack:
Jon Hjelleca91e382016-01-21 15:36:47 -080077 (rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack
78 type:(RTCMediaStreamTrackType)type {
Jon Hjelle81028792016-01-11 13:16:13 -080079 NSParameterAssert(nativeTrack);
80 if (self = [super init]) {
81 _nativeTrack = nativeTrack;
Jon Hjelleca91e382016-01-21 15:36:47 -080082 _type = type;
Jon Hjelle81028792016-01-11 13:16:13 -080083 }
84 return self;
85}
86
skvlad79b4b872016-04-08 17:28:55 -070087- (instancetype)initWithNativeTrack:
88 (rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack {
89 NSParameterAssert(nativeTrack);
90 if (nativeTrack->kind() ==
91 std::string(webrtc::MediaStreamTrackInterface::kAudioKind)) {
92 return [self initWithNativeTrack:nativeTrack
93 type:RTCMediaStreamTrackTypeAudio];
94 }
95 if (nativeTrack->kind() ==
96 std::string(webrtc::MediaStreamTrackInterface::kVideoKind)) {
97 return [self initWithNativeTrack:nativeTrack
98 type:RTCMediaStreamTrackTypeVideo];
99 }
100 return nil;
101}
102
103- (BOOL)isEqualToTrack:(RTCMediaStreamTrack *)track {
104 if (!track) {
105 return NO;
106 }
107 return _nativeTrack == track.nativeTrack;
108}
109
Jon Hjelle81028792016-01-11 13:16:13 -0800110+ (webrtc::MediaStreamTrackInterface::TrackState)nativeTrackStateForState:
111 (RTCMediaStreamTrackState)state {
112 switch (state) {
Jon Hjelle81028792016-01-11 13:16:13 -0800113 case RTCMediaStreamTrackStateLive:
114 return webrtc::MediaStreamTrackInterface::kLive;
115 case RTCMediaStreamTrackStateEnded:
116 return webrtc::MediaStreamTrackInterface::kEnded;
Jon Hjelle81028792016-01-11 13:16:13 -0800117 }
118}
119
120+ (RTCMediaStreamTrackState)trackStateForNativeState:
121 (webrtc::MediaStreamTrackInterface::TrackState)nativeState {
122 switch (nativeState) {
Jon Hjelle81028792016-01-11 13:16:13 -0800123 case webrtc::MediaStreamTrackInterface::kLive:
124 return RTCMediaStreamTrackStateLive;
125 case webrtc::MediaStreamTrackInterface::kEnded:
126 return RTCMediaStreamTrackStateEnded;
Jon Hjelle81028792016-01-11 13:16:13 -0800127 }
128}
129
130+ (NSString *)stringForState:(RTCMediaStreamTrackState)state {
131 switch (state) {
Jon Hjelle81028792016-01-11 13:16:13 -0800132 case RTCMediaStreamTrackStateLive:
133 return @"Live";
134 case RTCMediaStreamTrackStateEnded:
135 return @"Ended";
Jon Hjelle81028792016-01-11 13:16:13 -0800136 }
137}
138
Yura Yaroshevich415920b2018-02-22 13:55:22 +0300139+ (RTCMediaStreamTrack *)mediaTrackForNativeTrack:
140 (rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack {
141 NSParameterAssert(nativeTrack);
142 if (nativeTrack->kind() == webrtc::MediaStreamTrackInterface::kAudioKind) {
143 return
144 [[RTCAudioTrack alloc] initWithNativeTrack:nativeTrack type:RTCMediaStreamTrackTypeAudio];
145 } else if (nativeTrack->kind() == webrtc::MediaStreamTrackInterface::kVideoKind) {
146 return
147 [[RTCVideoTrack alloc] initWithNativeTrack:nativeTrack type:RTCMediaStreamTrackTypeVideo];
148 } else {
149 return [[RTCMediaStreamTrack alloc] initWithNativeTrack:nativeTrack];
150 }
151}
152
Jon Hjelle81028792016-01-11 13:16:13 -0800153@end