Advertisement
alexolliveira

Agora Voice(RTC)

Sep 15th, 2023
971
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 5.44 KB | Source Code | 0 0
  1.   var
  2.   rtc = AgoraRTC.createClient({ mode: "live", codec: "vp8" }),
  3.   localTracks = { audioTrack: null },
  4.   localTrackState = { audioTrackEnabled: true },
  5.   remoteUsers = {},
  6.   options = { appid: null, channel: null, uid: null, token: null, role: null },
  7.   volumeLevel = 50,
  8.   overlay = document.querySelector(".overlay");
  9.  
  10.   var formdata = new FormData();
  11.   formdata.append("room_id", room_id);
  12.   fetch('/source/controller/getRole.php', {
  13.     method: 'POST',
  14.     body: formdata
  15.   }).then(async function(response) {
  16.       response.text().then(async function(result) {
  17.         var obj = JSON.parse(result);
  18.         options.role = obj.role;
  19.       })
  20.   }).catch(async function(err) {
  21.     console.error(err);
  22.   });
  23.  
  24.   //AGORA TOKEN//
  25.   var tokenStage="entering";
  26.   var agoraService="RTC";
  27.   async function getToken(tokenStage,agoraService,room_id) {
  28.     var formdata = new FormData();
  29.     formdata.append("room_id",room_id);
  30.     switch (agoraService) {
  31.       case "RTC":
  32.       var url="RtcTokenGenerator";
  33.       break;
  34.       case "RTM":
  35.       var url="RtmTokenGenerator";
  36.       break;
  37.     }
  38.     fetch('/source/controller/agora/tokengenerator/'+url+'.php', {
  39.       method: 'POST',
  40.       body: formdata
  41.     }).then(async function(response) {
  42.       response.text().then(async function(result) {
  43.         var json = JSON.parse(result);
  44.         switch (tokenStage) {
  45.           case "entering":
  46.             options.appid = json.app_id;
  47.             options.token = json.token;
  48.             options.uid = json.user_id;
  49.             options.channel = json.room_id;
  50.             sessionStorage.setItem("room", true);
  51.             await initRTc();
  52.             break;
  53.  
  54.           case "renewal":
  55.             var token = json.token;
  56.             await rtc.renewToken(token);
  57.             break;
  58.         }
  59.       })
  60.     }).catch(async function(err) {
  61.       console.error(err);
  62.     });
  63.   }
  64.   getToken(tokenStage,agoraService,room_id);
  65.  
  66.   //INIT RTC//
  67.   var handleUser = ()=>{
  68.     rtc.on("user-published", handleUserPublished);
  69.     rtc.on("user-joined", handleUserJoined);
  70.     rtc.on("user-left", handleUserLeft);
  71.   }
  72.  
  73.   async function initRTc() {
  74.     rtc.setClientRole(options.role);
  75.     handleUser;
  76.     await rtc.join(options.appid, options.channel, options.token, options.uid || null);
  77.     if (options.role === "host") {
  78.       localTracks.audioTrack = await AgoraRTC.createMicrophoneAudioTrack();
  79.       muteAudio();
  80.       await rtc.publish(Object.values(localTracks));
  81.     }
  82.     rtc.enableAudioVolumeIndicator();
  83.   }
  84.  
  85.   var initVolumeIndicator = async () => {
  86.     AgoraRTC.setParameter('AUDIO_VOLUME_INDICATION_INTERVAL', 200);
  87.     rtc.on("volume-indicator", volumes => {
  88.       volumes.forEach((volume) => {
  89.         //console.log(`UID ${volume.uid} Level ${volume.level}`);
  90.         var attendee_id = document.querySelector("." + volume.uid);
  91.         try{
  92.           if (options.uid == volume.uid && volume.level > volumeLevel) {
  93.             attendee_id.classList.add("speaking");
  94.           } else if (options.uid == volume.uid && volume.level < volumeLevel) {
  95.             attendee_id.classList.remove("speaking");
  96.           }
  97.         }catch(error){
  98.           console.error(error)
  99.         }
  100.       });
  101.     })
  102.   }
  103.   initVolumeIndicator();
  104.  
  105.   //subscribe to a remote user
  106.   async function subscribe(user, mediaType) {
  107.     const uid = user.uid;
  108.     await rtc.subscribe(user, mediaType);
  109.     console.log("Successfully subscribed.");
  110.     if (mediaType === 'audio') {
  111.       user.audioTrack.play();
  112.     }
  113.   }
  114.  
  115.   //Add a user who has subscribed to the live channel to the local interface.
  116.   function handleUserPublished(user, mediaType) {
  117.     const id = user.uid;
  118.     remoteUsers[id] = user;
  119.     subscribe(user, mediaType);
  120.   }
  121.  
  122.   function handleUserJoined(user, mediaType) {
  123.     const id = user.uid;
  124.     remoteUsers[id] = user;
  125.     subscribe(user, mediaType);
  126.   }
  127.  
  128.   function handleUserLeft(user) {
  129.     const id = user.uid;
  130.     delete remoteUsers[id];
  131.   }
  132.  
  133.   async function leaveChannels() {
  134.     for (trackName in localTracks) {
  135.       var track = localTracks[trackName];
  136.       if (track) {
  137.         track.stop();
  138.         track.close();
  139.         localTracks[trackName] = undefined;
  140.       }
  141.       sessionStorage.removeItem("room");
  142.       sessionStorage.removeItem("memberNames");
  143.       remoteUsers = {};
  144.       await rtc.leave();
  145.       console.log("You left the room'" + options.channel + "'");
  146.     }
  147.   }
  148.   leaveChannels();
  149.  
  150.   function toggleMic() {
  151.     document.getElementById("mic-icon").addEventListener("click", function() {
  152.       if (localTrackState.audioTrackEnabled) {
  153.         muteAudio();
  154.       } else {
  155.         unmuteAudio();
  156.       }
  157.     })
  158.   }
  159.   toggleMic();
  160.  
  161.   async function muteAudio() {
  162.     if (!localTracks.audioTrack) return;
  163.     await localTracks.audioTrack.setEnabled(false);
  164.     localTrackState.audioTrackEnabled = false;
  165.     var mic_icon = document.getElementById("mic-icon");
  166.     mic_icon.innerHTML = "mic_off";
  167.     mic_icon.classList.add("text-error");
  168.     if (!mic_icon.classList.contains("c-hand")) {
  169.       mic_icon.classList.add("c-hand");
  170.     };
  171.   }
  172.   async function unmuteAudio() {
  173.     if (!localTracks.audioTrack) return;
  174.     await localTracks.audioTrack.setEnabled(true);
  175.     localTrackState.audioTrackEnabled = true;
  176.     var mic_icon = document.getElementById("mic-icon");
  177.     mic_icon.innerHTML = "mic";
  178.     mic_icon.classList.remove("text-error");
  179.     mic_icon.classList.add("text-success");
  180.   }
Tags: Java
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement