Closed Bug 779039 Opened 12 years ago Closed 12 years ago

Trying to play audio from multiple tabs leads to unexpected success

Categories

(Core :: WebRTC: Audio/Video, defect)

defect
Not set
normal

Tracking

()

VERIFIED FIXED

People

(Reporter: jsmith, Assigned: anant)

Details

(Whiteboard: [getUserMedia], [blocking-gum+])

Steps:

1. Go to https://people.mozilla.com/~anarayanan/gum_test.html in tab #1
2. Go to https://people.mozilla.com/~anarayanan/gum_test.html in tab #2
3. Select audio in tab #1 and wait for audio recording to start
4. Select audio in tab #2 - see hardware unavailable error
5. Select audio in tab #2 again

Expected:

A hardware unavailable error should be thrown on the 2nd tab.

Actual:

An unexpected success callback is shown. The audio recorder is shown on the 2nd tab, but the seeker to show recording happens never starts (probably cause in reality, the hardware was not available).
Whiteboard: [getUserMedia], [blocking-gum+]
Summary: Trying to record audio from multiple tabs - requesting on 2nd tab twice returns unexpected success → Trying to play audio from multiple tabs leads to unexpected success
This is a bug in the test page, not getUserMedia.
Assignee: nobody → ndesaulniers
(In reply to Anant Narayanan [:anant] from comment #1)
> This is a bug in the test page, not getUserMedia.

In that case, this probably doesn't block.
Whiteboard: [getUserMedia], [blocking-gum+] → [getUserMedia], [blocking-gum-]
This is NOT a bug in the test page.  The onsuccess callback is being called in error, not the onerror callback.  Possible that the allocate is not failing as it should with the Audio engine.
Whiteboard: [getUserMedia], [blocking-gum-] → [getUserMedia], [blocking-gum+]
Investigation thus far:
in gdb, the evaluation of this contional L63 of content/media/webrtc/MediaEngineWebRTCAudio.cpp seg faults.

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000000
Nick, try swapping the order of GetRecordingDeviceStatus and SetRecordingDevice (i.e. don't set until you know the device is available).
OS: Windows 7 → All
(In reply to Nick Desaulniers [:\n] from comment #4)
> Investigation thus far:
> in gdb, the evaluation of this contional L63 of
> content/media/webrtc/MediaEngineWebRTCAudio.cpp seg faults.
> 
> Program received signal EXC_BAD_ACCESS, Could not access memory.
> Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000000

So, this isn't happening anymore on new builds.  Current suspects:
L68: GetRecordingDeviceStatus should not change avail to true, which it currently does.  So it may either be implemented wrong, or SetRecordingDevice, mCapIndex or even the ptrVoEHw may be wrong.

For my future reference, I believe SetRecordingDevice is implemented here:
https://mxr.mozilla.org/mozilla-central/source/media/webrtc/trunk/src/modules/audio_device/main/source/audio_device_impl.cc#1554
and GetRecordingDeviceStatus is implemented here:https://mxr.mozilla.org/mozilla-central/source/media/webrtc/trunk/src/voice_engine/main/source/voe_hardware_impl.cc#577
ptrVoEHw->GetRecordingDeviceStatus(avail);
bad dog!
The first failure (clicking the audio button on the second tab for the first time) sets avail to false and the next lines, L70, returns NS_ERROR_FAILURE

Clicking the audio button on the second tab for a _second time_ avail is set to true.
Let's double check some values used in constructing the pointer and passed to method calls.

2nd tab first run:
p mVoiceEngine: 'webrtc::VoiceEngineImpl' *) 0x11493d000
p *mVoiceEngine: (webrtc::VoiceEngineImpl) {
  <webrtc::voe::SharedData> = {
    _vptr$SharedData = 0x103f3eaa0, 
    _instanceId = 1, 
    _apiCritPtr = 0x1090508d0, 
    _channelManager = {
      <webrtc::voe::ChannelManagerBase> = {
        _vptr$ChannelManagerBase = 0x103ecb0b0, 
        _itemsCritSectPtr = 0x109050ce0, 
        _items = {
          map_ = {
            _M_t = {
              _M_impl = {
                <std::allocator<std::_Rb_tree_node<std::pair<const int, webrtc::MapItem *>> >> = {
                  <__gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<const int, webrtc::MapItem *>> >> = {<No data fields>}, <No data fields>}, 
                members of std::_Rb_tree<int, std::pair<const int, webrtc::MapItem *>, std::_Select1st<std::pair<const int, webrtc::MapItem *>>, std::less<int>, std::allocator<std::pair<const int, webrtc::MapItem *>> >::_Rb_tree_impl<std::less<int>, false>: 
                _M_key_compare = {
                  <std::binary_function<int, int, bool>> = {<No data fields>}, <No data fields>}, 
                _M_header = {
                  _M_color = std::_S_red, 
                  _M_parent = 0x109d9b250, 
                  _M_left = 0x109d9b250, 
                  _M_right = 0x109d9b250
                }, 
                _M_node_count = 1
              }
            }
          }
        }, 
        _freeItemIds = {false, true <repeats 31 times>}, 
        _itemsRWLockPtr = 0x11b01e600
      }, 
      members of webrtc::voe::ChannelManager: 
      _instanceId = 1
    }, 
    _engineStatistics = {
      _critPtr = 0x109050d30, 
      _instanceId = 1, 
      _lastError = 0, 
      _isInitialized = true
    }, 
    _audioDevicePtr = 0x114c50000, 
    _outputMixerPtr = 0x113eb8000, 
    _transmitMixerPtr = 0x114c4e000, 
    _audioProcessingModulePtr = 0x114c5aec0, 
    _moduleProcessThreadPtr = 0x109050d80, 
    _externalRecording = false, 
    _externalPlayout = false, 
    _audioDeviceLayer = webrtc::AudioDeviceModule::kPlatformDefaultAudio
  }, 
  <webrtc::VoEAudioProcessingImpl> = {
    <webrtc::VoEAudioProcessing> = {
      _vptr$VoEAudioProcessing = 0x103f3eac0
    }, 
    <webrtc::voe::RefCount> = {
      _count = 0, 
      _crit = @0x1090a1740
    }, 
    members of webrtc::VoEAudioProcessingImpl: 
    _isAecMode = true, 
    _shared = 0x11493d000
  }, 
  <webrtc::VoECallReportImpl> = {
    <webrtc::VoECallReport> = {
      _vptr$VoECallReport = 0x103f3ebe0
    }, 
    <webrtc::voe::RefCount> = {
      _count = 0, 
      _crit = @0x1090a1790
    }, 
    members of webrtc::VoECallReportImpl: 
    _file = @0x109ccc000, 
    _shared = 0x11493d000
  }, 
  <webrtc::VoECodecImpl> = {
    <webrtc::VoECodec> = {
      _vptr$VoECodec = 0x103f3ec30
    }, 
    <webrtc::voe::RefCount> = {
      _count = 1, 
      _crit = @0x1090a17e0
    }, 
    members of webrtc::VoECodecImpl: 
    _shared = 0x11493d000
  }, 
  <webrtc::VoEDtmfImpl> = {
    <webrtc::VoEDtmf> = {
      _vptr$VoEDtmf = 0x103f3ece0
    }, 
    <webrtc::voe::RefCount> = {
      _count = 0, 
      _crit = @0x1090a18d0
    }, 
    members of webrtc::VoEDtmfImpl: 
    _dtmfFeedback = true, 
    _dtmfDirectFeedback = false, 
    _shared = 0x11493d000
  }, 
  <webrtc::VoEEncryptionImpl> = {
    <webrtc::VoEEncryption> = {
      _vptr$VoEEncryption = 0x103f3ed70
    }, 
    <webrtc::voe::RefCount> = {
      _count = 0, 
      _crit = @0x1090a19c0
    }, 
    members of webrtc::VoEEncryptionImpl: 
    _shared = 0x11493d000
  }, 
  <webrtc::VoEExternalMediaImpl> = {
    <webrtc::VoEExternalMedia> = {
      _vptr$VoEExternalMedia = 0x103f3edc8
    }, 
    <webrtc::voe::RefCount> = {
      _count = 1, 
      _crit = @0x1090a1a10
    }, 
    members of webrtc::VoEExternalMediaImpl: 
    playout_delay_ms_ = 0, 
    shared_ = 0x11493d000
  }, 
  <webrtc::VoEFileImpl> = {
    <webrtc::VoEFile> = {
      _vptr$VoEFile = 0x103f3ee20
    }, 
    <webrtc::voe::RefCount> = {
      _count = 0, 
      _crit = @0x1090a1ab0
    }, 
    members of webrtc::VoEFileImpl: 
    _shared = 0x11493d000
  }, 
  <webrtc::VoEHardwareImpl> = {
    <webrtc::VoEHardware> = {
      _vptr$VoEHardware = 0x103f3ef18
    }, 
    <webrtc::voe::RefCount> = {
      _count = 1, 
      _crit = @0x1090a1d30
    }, 
    members of webrtc::VoEHardwareImpl: 
    _cpu = 0x114cf8d60, 
    _shared = 0x11493d000
  }, 
  <webrtc::VoENetEqStatsImpl> = {
    <webrtc::VoENetEqStats> = {
      _vptr$VoENetEqStats = 0x103f3efd0
    }, 
    <webrtc::voe::RefCount> = {
      _count = 0, 
      _crit = @0x1090a1d80
    }, 
    members of webrtc::VoENetEqStatsImpl: 
    _shared = 0x11493d000
  }, 
  <webrtc::VoENetworkImpl> = {
    <webrtc::VoENetwork> = {
      _vptr$VoENetwork = 0x103f3f000
    }, 
    <webrtc::voe::RefCount> = {
      _count = 0, 
      _crit = @0x1090d51a0
    }, 
    members of webrtc::VoENetworkImpl: 
    _shared = 0x11493d000
  }, 
  <webrtc::VoERTP_RTCPImpl> = {
    <webrtc::VoERTP_RTCP> = {
      _vptr$VoERTP_RTCP = 0x103f3f0d0
    }, 
    <webrtc::voe::RefCount> = {
      _count = 0, 
      _crit = @0x1090d51f0
    }, 
    members of webrtc::VoERTP_RTCPImpl: 
    _shared = 0x11493d000
  }, 
  <webrtc::VoEVideoSyncImpl> = {
    <webrtc::VoEVideoSync> = {
      _vptr$VoEVideoSync = 0x103f3f1c0
    }, 
    <webrtc::voe::RefCount> = {
      _count = 0, 
      _crit = @0x1090d5470
    }, 
    members of webrtc::VoEVideoSyncImpl: 
    _shared = 0x11493d000
  }, 
  <webrtc::VoEVolumeControlImpl> = {
    <webrtc::VoEVolumeControl> = {
      _vptr$VoEVolumeControl = 0x103f3f220
    }, 
    <webrtc::voe::RefCount> = {
      _count = 0, 
      _crit = @0x1090d54c0
    }, 
    members of webrtc::VoEVolumeControlImpl: 
    _shared = 0x11493d000
  }, 
  <webrtc::VoEBaseImpl> = {
    <webrtc::VoEBase> = {
      _vptr$VoEBase = 0x103f3f2d8
    }, 
    <webrtc::voe::RefCount> = {
      _count = 4, 
      _crit = @0x1090d5740
    }, 
    <webrtc::AudioTransport> = {
      _vptr$AudioTransport = 0x103f3f3e8
    }, 
    <webrtc::AudioDeviceObserver> = {
      _vptr$AudioDeviceObserver = 0x103f3f418
    }, 
    members of webrtc::VoEBaseImpl: 
    _voiceEngineObserverPtr = 0x0, 
    _callbackCritSect = @0x1090d57e0, 
    _voiceEngineObserver = false, 
    _oldVoEMicLevel = 255, 
    _oldMicLevel = 255, 
    _audioFrame = {
      _vptr$AudioFrame = 0x103f39d90, 
      _id = -1, 
      _timeStamp = 0, 
      _payloadData = {0 <repeats 3840 times>}, 
      _payloadDataLengthInSamples = 0, 
      _frequencyInHz = 0, 
      _audioChannel = 1 '\001', 
      _speechType = webrtc::AudioFrame::kUndefined, 
      _vadActivity = webrtc::AudioFrame::kVadUnknown, 
      _energy = 4294967295, 
      _volume = -1
    }, 
    _shared = 0x11493d000
  }, <No data fields>}
p mCapIndex: 0

2nd tab second run:
p mVoiceEngine: ('webrtc::VoiceEngineImpl' *) 0x11493d000
p *mVoiceEngine: (webrtc::VoiceEngineImpl) {
  <webrtc::voe::SharedData> = {
    _vptr$SharedData = 0x103f3eaa0, 
    _instanceId = 1, 
    _apiCritPtr = 0x1090508d0, 
    _channelManager = {
      <webrtc::voe::ChannelManagerBase> = {
        _vptr$ChannelManagerBase = 0x103ecb0b0, 
        _itemsCritSectPtr = 0x109050ce0, 
        _items = {
          map_ = {
            _M_t = {
              _M_impl = {
                <std::allocator<std::_Rb_tree_node<std::pair<const int, webrtc::MapItem *>> >> = {
                  <__gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<const int, webrtc::MapItem *>> >> = {<No data fields>}, <No data fields>}, 
                members of std::_Rb_tree<int, std::pair<const int, webrtc::MapItem *>, std::_Select1st<std::pair<const int, webrtc::MapItem *>>, std::less<int>, std::allocator<std::pair<const int, webrtc::MapItem *>> >::_Rb_tree_impl<std::less<int>, false>: 
                _M_key_compare = {
                  <std::binary_function<int, int, bool>> = {<No data fields>}, <No data fields>}, 
                _M_header = {
                  _M_color = std::_S_red, 
                  _M_parent = 0x109d9b250, 
                  _M_left = 0x109d9b250, 
                  _M_right = 0x10a308c40
                }, 
                _M_node_count = 2
              }
            }
          }
        }, 
        _freeItemIds = {false, false, true <repeats 30 times>}, 
        _itemsRWLockPtr = 0x11b01e600
      }, 
      members of webrtc::voe::ChannelManager: 
      _instanceId = 1
    }, 
    _engineStatistics = {
      _critPtr = 0x109050d30, 
      _instanceId = 1, 
      _lastError = 0, 
      _isInitialized = true
    }, 
    _audioDevicePtr = 0x114c50000, 
    _outputMixerPtr = 0x113eb8000, 
    _transmitMixerPtr = 0x114c4e000, 
    _audioProcessingModulePtr = 0x114c5aec0, 
    _moduleProcessThreadPtr = 0x109050d80, 
    _externalRecording = false, 
    _externalPlayout = false, 
    _audioDeviceLayer = webrtc::AudioDeviceModule::kPlatformDefaultAudio
  }, 
  <webrtc::VoEAudioProcessingImpl> = {
    <webrtc::VoEAudioProcessing> = {
      _vptr$VoEAudioProcessing = 0x103f3eac0
    }, 
    <webrtc::voe::RefCount> = {
      _count = 0, 
      _crit = @0x1090a1740
    }, 
    members of webrtc::VoEAudioProcessingImpl: 
    _isAecMode = true, 
    _shared = 0x11493d000
  }, 
  <webrtc::VoECallReportImpl> = {
    <webrtc::VoECallReport> = {
      _vptr$VoECallReport = 0x103f3ebe0
    }, 
    <webrtc::voe::RefCount> = {
      _count = 0, 
      _crit = @0x1090a1790
    }, 
    members of webrtc::VoECallReportImpl: 
    _file = @0x109ccc000, 
    _shared = 0x11493d000
  }, 
  <webrtc::VoECodecImpl> = {
    <webrtc::VoECodec> = {
      _vptr$VoECodec = 0x103f3ec30
    }, 
    <webrtc::voe::RefCount> = {
      _count = 1, 
      _crit = @0x1090a17e0
    }, 
    members of webrtc::VoECodecImpl: 
    _shared = 0x11493d000
  }, 
  <webrtc::VoEDtmfImpl> = {
    <webrtc::VoEDtmf> = {
      _vptr$VoEDtmf = 0x103f3ece0
    }, 
    <webrtc::voe::RefCount> = {
      _count = 0, 
      _crit = @0x1090a18d0
    }, 
    members of webrtc::VoEDtmfImpl: 
    _dtmfFeedback = true, 
    _dtmfDirectFeedback = false, 
    _shared = 0x11493d000
  }, 
  <webrtc::VoEEncryptionImpl> = {
    <webrtc::VoEEncryption> = {
      _vptr$VoEEncryption = 0x103f3ed70
    }, 
    <webrtc::voe::RefCount> = {
      _count = 0, 
      _crit = @0x1090a19c0
    }, 
    members of webrtc::VoEEncryptionImpl: 
    _shared = 0x11493d000
  }, 
  <webrtc::VoEExternalMediaImpl> = {
    <webrtc::VoEExternalMedia> = {
      _vptr$VoEExternalMedia = 0x103f3edc8
    }, 
    <webrtc::voe::RefCount> = {
      _count = 2, 
      _crit = @0x1090a1a10
    }, 
    members of webrtc::VoEExternalMediaImpl: 
    playout_delay_ms_ = 0, 
    shared_ = 0x11493d000
  }, 
  <webrtc::VoEFileImpl> = {
    <webrtc::VoEFile> = {
      _vptr$VoEFile = 0x103f3ee20
    }, 
    <webrtc::voe::RefCount> = {
      _count = 0, 
      _crit = @0x1090a1ab0
    }, 
    members of webrtc::VoEFileImpl: 
    _shared = 0x11493d000
  }, 
  <webrtc::VoEHardwareImpl> = {
    <webrtc::VoEHardware> = {
      _vptr$VoEHardware = 0x103f3ef18
    }, 
    <webrtc::voe::RefCount> = {
      _count = 2, 
      _crit = @0x1090a1d30
    }, 
    members of webrtc::VoEHardwareImpl: 
    _cpu = 0x114cf8d60, 
    _shared = 0x11493d000
  }, 
  <webrtc::VoENetEqStatsImpl> = {
    <webrtc::VoENetEqStats> = {
      _vptr$VoENetEqStats = 0x103f3efd0
    }, 
    <webrtc::voe::RefCount> = {
      _count = 0, 
      _crit = @0x1090a1d80
    }, 
    members of webrtc::VoENetEqStatsImpl: 
    _shared = 0x11493d000
  }, 
  <webrtc::VoENetworkImpl> = {
    <webrtc::VoENetwork> = {
      _vptr$VoENetwork = 0x103f3f000
    }, 
    <webrtc::voe::RefCount> = {
      _count = 0, 
      _crit = @0x1090d51a0
    }, 
    members of webrtc::VoENetworkImpl: 
    _shared = 0x11493d000
  }, 
  <webrtc::VoERTP_RTCPImpl> = {
    <webrtc::VoERTP_RTCP> = {
      _vptr$VoERTP_RTCP = 0x103f3f0d0
    }, 
    <webrtc::voe::RefCount> = {
      _count = 0, 
      _crit = @0x1090d51f0
    }, 
    members of webrtc::VoERTP_RTCPImpl: 
    _shared = 0x11493d000
  }, 
  <webrtc::VoEVideoSyncImpl> = {
    <webrtc::VoEVideoSync> = {
      _vptr$VoEVideoSync = 0x103f3f1c0
    }, 
    <webrtc::voe::RefCount> = {
      _count = 0, 
      _crit = @0x1090d5470
    }, 
    members of webrtc::VoEVideoSyncImpl: 
    _shared = 0x11493d000
  }, 
  <webrtc::VoEVolumeControlImpl> = {
    <webrtc::VoEVolumeControl> = {
      _vptr$VoEVolumeControl = 0x103f3f220
    }, 
    <webrtc::voe::RefCount> = {
      _count = 0, 
      _crit = @0x1090d54c0
    }, 
    members of webrtc::VoEVolumeControlImpl: 
    _shared = 0x11493d000
  }, 
  <webrtc::VoEBaseImpl> = {
    <webrtc::VoEBase> = {
      _vptr$VoEBase = 0x103f3f2d8
    }, 
    <webrtc::voe::RefCount> = {
      _count = 4, 
      _crit = @0x1090d5740
    }, 
    <webrtc::AudioTransport> = {
      _vptr$AudioTransport = 0x103f3f3e8
    }, 
    <webrtc::AudioDeviceObserver> = {
      _vptr$AudioDeviceObserver = 0x103f3f418
    }, 
    members of webrtc::VoEBaseImpl: 
    _voiceEngineObserverPtr = 0x0, 
    _callbackCritSect = @0x1090d57e0, 
    _voiceEngineObserver = false, 
    _oldVoEMicLevel = 255, 
    _oldMicLevel = 255, 
    _audioFrame = {
      _vptr$AudioFrame = 0x103f39d90, 
      _id = -1, 
      _timeStamp = 0, 
      _payloadData = {0 <repeats 3840 times>}, 
      _payloadDataLengthInSamples = 0, 
      _frequencyInHz = 0, 
      _audioChannel = 1 '\001', 
      _speechType = webrtc::AudioFrame::kUndefined, 
      _vadActivity = webrtc::AudioFrame::kVadUnknown, 
      _energy = 4294967295, 
      _volume = -1
    }, 
    _shared = 0x11493d000
  }, <No data fields>}
p mCapIndex: 0
Sorry for dumping all that garbage in the comment, you may want to click the collapse (minus sign) on that comment.  The gist is the webrtc::VoEHardware* points to the same object both iterations, so it's probably a bug in GetRecordingDeviceStatus.
2nd tab first run:
runs through getRecordingDeviceStatus and returns 0 at the end.
Passed false, stays false.
p _shared->audio_device(): 

2nd tab second run through:
runs through getRecordingDeviceStatus and returns 0 at the end.
Passed false, changes to true at line 602.
https://mxr.mozilla.org/mozilla-central/source/media/webrtc/trunk/src/voice_engine/main/source/voe_hardware_impl.cc#602
p _shared->audio_device(): 

So now the problem appears to lie in _shared->audio_device()->RecordingIsAvailable(&available)

:ekr points out that the audio in the first tab is getting borked when the second tab fails.  So the second click in the second tab may be reporting correctly, since the first error in the second tab brings down both audio sources.
Working with :ekr.  Looks like it's an error with the GIPS code because if you run ptrVoEHw->GetRecordingDeviceStatus(avail); twice in a row with two different parameter variables the first is set false and the second is set true.

https://mxr.mozilla.org/mozilla-central/source/media/webrtc/trunk/src/modules/audio_device/main/source/mac/audio_device_mac.cc#1550

We shouldn't be calling GetRecordingDeviceStatus twice?  Should we create a new mediaEngine per time we try to access a device, or is it more likely the GIPS code is broken?
Surrendering this bug, as it's out of my league.  Anant should look into whether this is a problem with our implementation or a lower level bug in the GIPS code.  :ekr can provide further information.
Assignee: ndesaulniers → nobody
Thanks Nick! After speaking with ekr, it certainly seems like this is a much larger issue that will likely need some refactoring of the GIPS MediaEngine code.
Assignee: nobody → anant
Nick: thanks for diagnosing this.

I think the basic problem is that you need 1 voiceengine per usage, not one for the process as a whole.... That's the strategy we have adopted in webrtc.
One drawback of using 1 voiceengine per instance is that we'd lose the ability to share the same camera across multiple tabs, or even multiple Firefox instances. The latter has certainly been very useful during these early stages of testing!

I'm thinking we might need to keep the existing functionality, while allowing the user to select a new camera as well. This will all be much easier once we actually have a UI, which will tell us what exactly the user wants :)
So what happens if tab A decides to change resolution. What happens to tab B?
Bug 802411 should have fixed this.
Status: NEW → RESOLVED
Closed: 12 years ago
Resolution: --- → FIXED
Keywords: verifyme
(In reply to Anant Narayanan [:anant] from comment #17)
> Bug 802411 should have fixed this.

I can still get a reproduction of this bug on the 10/19 build. Reopening.
Status: RESOLVED → REOPENED
Keywords: verifyme
Resolution: FIXED → ---
I can't reproduce this, did you perform the same steps as comment #0? What platform and test page?

I get the "HARDWARE_UNAVAILABLE" error everytime I try to get audio if recording is already ongoing.
(In reply to Anant Narayanan [:anant] from comment #19)
> I can't reproduce this, did you perform the same steps as comment #0? What
> platform and test page?
> 
> I get the "HARDWARE_UNAVAILABLE" error everytime I try to get audio if
> recording is already ongoing.

Crap. Yeah I did this wrong, but I may have found 2 bugs in the progress for something different. Let me try again and resolve fix it again...
Status: REOPENED → RESOLVED
Closed: 12 years ago12 years ago
Resolution: --- → FIXED
Keywords: verifyme
Retested. Well, I'm not getting a success callback, but I'm not getting HARDWARE_UNAVAILABLE either. The issue I'm hitting sounds very similar to bug 802656, so I'll track it there.

Marking as verified for now mainly since at a minimum, I'm not success callback, which is the important part of the bug.
Status: RESOLVED → VERIFIED
Keywords: verifyme
probably not a candidate for a mochitest, but might be a candidate for a mozmill test
Flags: in-testsuite-
Flags: in-qa-testsuite?
Should probably be perfect for a browser chrome test which can handle two tabs. But not sure if we can really replicate that in a test with faked media streams. If that doesn't work in can't be part of any test suite and would require a manual test.
Flags: in-testsuite?
Flags: in-testsuite-
Flags: in-qa-testsuite?
You need to log in before you can comment on or make changes to this bug.