8000 [Windows] Feature of selecting i/o audio devices by passing sourceId … · dontcryme/flutter-webrtc@a2b90f9 · GitHub
[go: up one dir, main page]

Skip to content

Commit a2b90f9

Browse files
authored
[Windows] Feature of selecting i/o audio devices by passing sourceId and/or deviceId constraints (flutter-webrtc#851)
* implemented functionality of selecting specific audio devices for input (by constraints->optional->sourceId) and for output (by constraints->deviceId) * device's ids and labels was mixed up in GetSources() Co-authored-by: n.morozov <n.morozov@teleguard.com>
1 parent cc96251 commit a2b90f9

File tree

1 file changed

+60
-24
lines changed

1 file changed

+60
-24
lines changed

common/cpp/src/flutter_media_stream.cc

Lines changed: 60 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -58,29 +58,83 @@ void addDefaultAudioConstraints(
5858
audioConstraints->AddOptionalConstraint("googDAEchoCancellation", "true");
5959
}
6060

61+
std::string getSourceIdConstraint(const EncodableMap& mediaConstraints) {
62+
auto it = mediaConstraints.find(EncodableValue("optional"));
63+
if (it != mediaConstraints.end() &&
64+
TypeIs<EncodableList>(it->second)) {
65+
EncodableList optional = GetValue<EncodableList>(it->second);
66+
for (size_t i = 0, size = optional.size(); i < size; i++) {
67+
if (TypeIs<EncodableMap>(optional[i])) {
68+
EncodableMap option = GetValue<EncodableMap>(optional[i]);
69+
auto it2 = option.find(EncodableValue("sourceId"));
70+
if (it2 != option.end() && TypeIs<std::string>(it2->second)) {
71+
return GetValue<std::string>(it2->second);
72+
}
73+
}
74+
}
75+
}
76+
return "";
77+
}
78+
79+
std::string getDeviceIdConstraint(const EncodableMap& mediaConstraints) {
80+
auto it = mediaConstraints.find(EncodableValue("deviceId"));
81+
if (it != mediaConstraints.end() && TypeIs<std::string>(it->second)) {
82+
return GetValue<std::string>(it->second);
83+
}
84+
return "";
85+
}
86+
6187
void FlutterMediaStream::GetUserAudio(const EncodableMap& constraints,
6288
scoped_refptr<RTCMediaStream> stream,
6389
EncodableMap& params) {
6490
bool enable_audio = false;
6591
scoped_refptr<RTCMediaConstraints> audioConstraints;
92+
std::string sourceId;
93+
std::string deviceId;
6694
auto it = constraints.find(EncodableValue("audio"));
6795
if (it != constraints.end()) {
6896
EncodableValue audio = it->second;
6997
if (TypeIs<bool>(audio)) {
7098
audioConstraints = RTCMediaConstraints::Create();
7199
addDefaultAudioConstraints(audioConstraints);
72100
enable_audio = GetValue<bool>(audio);
101+
sourceId = "";
102+
deviceId = "";
73103
}
74104
if (TypeIs<EncodableMap>(audio)) {
105+
EncodableMap localMap = GetValue<EncodableMap>(audio);
106+
sourceId = getSourceIdConstraint(localMap);
107+
deviceId = getDeviceIdConstraint(localMap);
75108
audioConstraints =
76-
base_->ParseMediaConstraints(GetValue<EncodableMap>(audio));
109+
base_->ParseMediaConstraints(localMap);
77110
enable_audio = true;
78111
}
79112
}
80113

81-
// TODO: Select audio device by sourceId,
114+
// Selecting audio input device by sourceId and audio output device by deviceId
82115

83116
if (enable_audio) {
117+
char strRecordingName[256];
118+
char strRecordingGuid[256];
119+
int playout_devices = base_->audio_device_->PlayoutDevices();
120+
int recording_devices = base_->audio_device_->RecordingDevices();
121+
122+
for (uint16_t i = 0; i < recording_devices; i++) {
123+
base_->audio_device_->RecordingDeviceName(i, strRecordingName, strRecordingGuid);
124+
if (sourceId != "" && sourceId == strRecordingGuid) {
125+
base_->audio_device_->SetRecordingDevice(i);
126+
}
127+
}
128+
129+
char strPlayoutName[256];
130+
char strPlayoutGuid[256];
131+
for (uint16_t i = 0; i < playout_devices; i++) {
132+
base_->audio_device_->PlayoutDeviceName(i, strPlayoutName, strPlayoutGuid);
133+
if (deviceId != "" && deviceId == strPlayoutGuid) {
134+
base_->audio_device_->SetPlayoutDevice(i);
135+
}
136+
}
137+
84138
scoped_refptr<RTCAudioSource> source =
85139
base_->factory_->CreateAudioSource("audio_input");
86140
std::string uuid = base_->GenerateUUID();
@@ -112,24 +166,6 @@ std::string getFacingMode(const EncodableMap& mediaConstraints) {
112166
: "";
113167
}
114168

115-
std::string getSourceIdConstraint(const EncodableMap& mediaConstraints) {
116-
auto it = mediaConstraints.find(EncodableValue("optional"));
117-
if (it != mediaConstraints.end() &&
118-
TypeIs<EncodableList>(it->second)) {
119-
EncodableList optional = GetValue<EncodableList>(it->second);
120-
for (size_t i = 0, size = optional.size(); i < size; i++) {
121-
if (TypeIs<EncodableMap>(optional[i])) {
122-
EncodableMap option = GetValue<EncodableMap>(optional[i]);
123-
auto it2 = option.find(EncodableValue("sourceId"));
124-
if (it2 != option.end() && TypeIs<std::string>(it2->second)) {
125-
return GetValue<std::string>(it2->second);
126-
}
127-
}
128-
}
129-
}
130-
return "";
131-
}
132-
133169
EncodableValue getConstrainInt(const EncodableMap& constraints, const std::string& key) {
134170
EncodableValue value;
135171
auto it = constraints.find(EncodableValue(key));
@@ -265,8 +301,8 @@ void FlutterMediaStream::GetSources(
265301
for (uint16_t i = 0; i < nb_audio_devices; i++) {
266302
base_->audio_device_->PlayoutDeviceName(i, strNameUTF8, strGuidUTF8);
267303
EncodableMap audio;
268-
audio[EncodableValue("label")] = EncodableValue(std::string(strGuidUTF8));
269-
audio[EncodableValue("deviceId")] = EncodableValue(std::string(strNameUTF8));
304+
audio[EncodableValue("label")] = EncodableValue(std::string(strNameUTF8));
305+
audio[EncodableValue("deviceId")] = EncodableValue(std::string(strGuidUTF8));
270306
audio[EncodableValue("facing")] = "";
271307
audio[EncodableValue("kind")] = "audiooutput";
272308
sources.push_back(EncodableValue(audio));
@@ -276,8 +312,8 @@ void FlutterMediaStream::GetSources(
276312
for (int i = 0; i < nb_video_devices; i++) {
277313
base_->video_device_->GetDeviceName(i, strNameUTF8, 128, strGuidUTF8, 128);
278314
EncodableMap video;
279-
video[EncodableValue("label")] = EncodableValue(std::string(strGuidUTF8));
280-
video[EncodableValue("deviceId")] = EncodableValue(std::string(strNameUTF8));
315+
video[EncodableValue("label")] = EncodableValue(std::string(strNameUTF8));
316+
video[EncodableValue("deviceId")] = EncodableValue(std::string(strGuidUTF8));
281317
video[EncodableValue("facing")] = i == 1 ? "front" : "back";
282318
video[EncodableValue("kind")] = "videoinput";
283319
sources.push_back(EncodableValue(video));

0 commit comments

Comments
 (0)
0