MicrophonePlugin.jslib 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. var MicrophonePlugin = {
  2. buffer: undefined,
  3. Init: function() {
  4. console.log("Init:");
  5. // START - used to read the volume
  6. document.volume = 0;
  7. var byteOffset = 0;
  8. var length = 1024;
  9. this.buffer = new ArrayBuffer(4 * length);
  10. document.dataArray = new Float32Array(this.buffer, byteOffset, length);
  11. // END - used to read the volume
  12. navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
  13. if (navigator.getUserMedia) {
  14. var constraints = {
  15. audio: {
  16. optional: [{
  17. sourceId: "audioSource"
  18. }]
  19. }
  20. };
  21. navigator.getUserMedia(constraints, function(stream) {
  22. console.log('navigator.getUserMedia successCallback: ', stream);
  23. document.position = 0;
  24. document.audioContext = new AudioContext();
  25. document.tempSize = 1024;
  26. document.tempArray = new Float32Array(document.tempSize)
  27. document.analyser = document.audioContext.createAnalyser();
  28. document.analyser.minDecibels = -90;
  29. document.analyser.maxDecibels = -10;
  30. document.analyser.smoothingTimeConstant = 0.85;
  31. document.mediaRecorder = new MediaRecorder(stream);
  32. document.source = document.audioContext.createMediaStreamSource(stream);
  33. document.source.connect(document.analyser);
  34. document.mediaRecorder.start();
  35. console.log(document.mediaRecorder.state);
  36. document.readDataOnInterval = function() {
  37. if (document.dataArray == undefined) {
  38. setTimeout(document.readDataOnInterval, 250); //wait to be set
  39. return;
  40. }
  41. document.tempInterval = Math.floor(document.tempSize / document.dataArray.length * 250);
  42. // read the next chunk after interval
  43. setTimeout(document.readDataOnInterval, document.tempInterval); //if mic is still active
  44. if (document.dataArray == undefined) {
  45. return;
  46. }
  47. //read the temp data buffer
  48. document.analyser.getFloatTimeDomainData(document.tempArray);
  49. // use the amplitude to get volume
  50. document.volume = 0;
  51. var j = (document.position + document.dataArray.length - document.tempSize) % document.dataArray.length;
  52. for (var i = 0; i < document.tempSize; ++i) {
  53. document.volume = Math.max(document.volume, Math.abs(document.tempArray[i]));
  54. document.dataArray[j] = document.tempArray[i];
  55. j = (j + 1) % document.dataArray.length;
  56. }
  57. document.position = (document.position + document.tempSize) % document.dataArray.length;
  58. };
  59. document.readDataOnInterval();
  60. }, function(error) {
  61. console.error('navigator.getUserMedia errorCallback: ', error);
  62. });
  63. }
  64. },
  65. QueryAudioInput: function() {
  66. console.log("QueryAudioInput");
  67. document.mMicrophones = [];
  68. if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {
  69. console.log("enumerateDevices() not supported.");
  70. } else {
  71. // List microphones
  72. navigator.mediaDevices.enumerateDevices()
  73. .then(function(devices) {
  74. devices.forEach(function(device) {
  75. console.log("QueryAudioInput: kind="+device.kind + " device=", device, " label=" + device.label);
  76. if (device.kind === 'audioinput') {
  77. document.mMicrophones.push(device.label);
  78. }
  79. });
  80. })
  81. .catch(function(err) {
  82. console.error(err.name + ": " + err.message);
  83. });
  84. }
  85. },
  86. GetNumberOfMicrophones: function() {
  87. console.log("GetNumberOfMicrophones");
  88. var microphones = document.mMicrophones;
  89. if (microphones == undefined) {
  90. console.log("GetNumberOfMicrophones", 0);
  91. return 0;
  92. }
  93. console.log("GetNumberOfMicrophones length="+microphones.length);
  94. return microphones.length;
  95. },
  96. GetMicrophoneDeviceName: function(index) {
  97. //console.log("GetMicrophoneDeviceName");
  98. var returnStr = "Not Set";
  99. var microphones = document.mMicrophones;
  100. if (microphones != undefined) {
  101. if (index >= 0 && index < microphones.length) {
  102. if (microphones[index] != undefined) {
  103. returnStr = microphones[index];
  104. }
  105. }
  106. }
  107. console.log("GetMicrophoneDeviceName", returnStr);
  108. var buffer = _malloc(lengthBytesUTF8(returnStr) + 1);
  109. writeStringToMemory(returnStr, buffer);
  110. return buffer;
  111. },
  112. GetMicrophoneVolume: function(index) {
  113. console.log("GetMicrophoneVolume");
  114. if (document.volume == undefined) {
  115. return 0;
  116. }
  117. console.log("GetMicrophoneVolume", document.volume);
  118. return document.volume;
  119. }
  120. };
  121. mergeInto(LibraryManager.library, MicrophonePlugin);