@@ -23,6 +23,8 @@ class _GetUserMediaSampleState extends State<GetUserMediaSample> {
2323 MediaRecorder _mediaRecorder;
2424 bool get _isRec => _mediaRecorder != null ;
2525
26+ List <MediaDeviceInfo > _mediaDevicesList;
27+
2628 @override
2729 void initState () {
2830 super .initState ();
@@ -60,6 +62,7 @@ class _GetUserMediaSampleState extends State<GetUserMediaSample> {
6062
6163 try {
6264 var stream = await navigator.getUserMedia (mediaConstraints);
65+ _mediaDevicesList = await navigator.mediaDevices.enumerateDevices ();
6366 _localStream = stream;
6467 _localRenderer.srcObject = _localStream;
6568 } catch (e) {
@@ -172,6 +175,21 @@ class _GetUserMediaSampleState extends State<GetUserMediaSample> {
172175 icon: Icon (_isRec ? Icons .stop : Icons .fiber_manual_record),
173176 onPressed: _isRec ? _stopRecording : _startRecording,
174177 ),
178+ PopupMenuButton <String >(
179+ onSelected: _selectAudioOutput,
180+ itemBuilder: (BuildContext context) {
181+ return _mediaDevicesList
182+ .where ((device) => device.kind == 'audiooutput' )
183+ .map ((device) {
184+ if (device.kind == 'audiooutput' ) {
185+ return PopupMenuItem <String >(
186+ value: device.deviceId,
187+ child: Text (device.label),
188+ );
189+ }
190+ }).toList ();
191+ },
192+ ),
175193 ]
176194 : null ,
177195 ),
@@ -195,4 +213,8 @@ class _GetUserMediaSampleState extends State<GetUserMediaSample> {
195213 ),
196214 );
197215 }
216+
217+ void _selectAudioOutput (String deviceId) {
218+ _localRenderer.audioOutput = deviceId;
219+ }
198220}
0 commit comments