import React, { useEffect, useState, useRef } from "react";
import io from "socket.io-client";
import Form from "./components/Form";
import Listen from "./components/Listen";
import CarouselSliders from "./components/CarouselSliders";
import AnimatedNumber from "react-animated-numbers";
import { FaMicrophoneLines } from "react-icons/fa6";
import { LiaLaptopSolid } from "react-icons/lia";
import { ToastContainer, toast, Slide } from "react-toastify";
import "react-toastify/dist/ReactToastify.css";
import { MediaRecorder, register } from "extendable-media-recorder";
import { connect } from "extendable-media-recorder-wav-encoder";
// var socket = io("http://localhost:5000");
var socket = io("https://localport.online:4443/");
function App() {
const [stream, setStream] = useState();
const [matches, setMatches] = useState([]);
const [totalSongs, setTotalSongs] = useState(10);
const [isListening, setisListening] = useState(false);
const [audioInput, setAudioInput] = useState("device"); // or "mic"
const [isPhone, setIsPhone] = useState(window.innerWidth <= 550);
const [registeredMediaEncoder, setRegisteredMediaEncoder] = useState(false);
const streamRef = useRef(stream);
let sendRecordingRef = useRef(true);
useEffect(() => {
streamRef.current = stream;
}, [stream]);
useEffect(() => {
if (isPhone) {
setAudioInput("mic");
}
socket.on("connect", () => {
socket.emit("totalSongs", "");
});
socket.on("matches", (matches) => {
matches = JSON.parse(matches);
if (matches) {
setMatches(matches.slice(0, 5));
console.log("Matches: ", matches);
} else {
toast("No song found.");
}
cleanUp();
});
socket.on("downloadStatus", (msg) => {
msg = JSON.parse(msg);
const msgTypes = ["info", "success", "error"];
if (msg.type !== undefined && msgTypes.includes(msg.type)) {
toast[msg.type](() =>
{msg.message}
);
} else {
toast(msg.message);
}
});
socket.on("totalSongs", (songsCount) => {
setTotalSongs(songsCount);
});
}, []);
useEffect(() => {
const emitTotalSongs = () => {
socket.emit("totalSongs", "");
};
const intervalId = setInterval(emitTotalSongs, 8000);
return () => clearInterval(intervalId);
}, []);
async function record() {
try {
const mediaDevice =
audioInput === "device"
? navigator.mediaDevices.getDisplayMedia.bind(navigator.mediaDevices)
: navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);
if (!registeredMediaEncoder) {
await register(await connect());
setRegisteredMediaEncoder(true);
}
const constraints = {
audio: {
autoGainControl: false,
channelCount: 1,
echoCancellation: true,
noiseSuppression: true,
sampleSize: 16,
},
};
const stream = await mediaDevice(constraints);
const audioTracks = stream.getAudioTracks();
const audioStream = new MediaStream(audioTracks);
setStream(audioStream);
audioTracks[0].onended = stopListening;
// Stop video tracks
for (const track of stream.getVideoTracks()) {
track.stop();
}
// const audioContext = new AudioContext({
// sampleRate: 44100,
// });
// const mediaStreamAudioSourceNode = new MediaStreamAudioSourceNode(
// audioContext,
// { mediaStream: audioStream }
// );
// const mediaStreamAudioDestinationNode =
// new MediaStreamAudioDestinationNode(audioContext, {
// channelCount: 1,
// });
// mediaStreamAudioSourceNode.connect(mediaStreamAudioDestinationNode);
// const mediaRecorder = new MediaRecorder(
// mediaStreamAudioDestinationNode.stream,
// { mimeType: "audio/wav" }
// );
// const settings = mediaStreamAudioDestinationNode.stream
// .getAudioTracks()[0]
// .getSettings();
// console.log("Settings: ", settings);
const mediaRecorder = new MediaRecorder(audioStream, {
mimeType: "audio/wav",
});
mediaRecorder.start();
setisListening(true);
sendRecordingRef.current = true;
const chunks = [];
mediaRecorder.ondataavailable = function (e) {
chunks.push(e.data);
};
// Stop recording after 15 seconds
setTimeout(function () {
mediaRecorder.stop();
}, 15000);
mediaRecorder.addEventListener("stop", () => {
const blob = new Blob(chunks, { type: "audio/wav" });
const reader = new FileReader();
cleanUp();
// downloadRecording(blob);
reader.readAsArrayBuffer(blob);
reader.onload = (event) => {
const arrayBuffer = event.target.result;
var binary = "";
var bytes = new Uint8Array(arrayBuffer);
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[i]);
}
// Convert byte array to base64
const rawAudio = btoa(binary);
const audioConfig = audioStream.getAudioTracks()[0].getSettings();
const recordData = {
audio: rawAudio,
channels: audioConfig.channelCount,
sampleRate: audioConfig.sampleRate,
sampleSize: audioConfig.sampleSize,
};
if (sendRecordingRef.current) {
socket.emit("newRecording", JSON.stringify(recordData));
}
};
});
} catch (error) {
console.error("error:", error);
cleanUp();
}
}
function downloadRecording(blob) {
const blobUrl = URL.createObjectURL(blob);
// Create a download link
const downloadLink = document.createElement("a");
downloadLink.href = blobUrl;
downloadLink.download = "recorded_audio.wav";
document.body.appendChild(downloadLink);
downloadLink.click();
}
function cleanUp() {
const currentStream = streamRef.current;
if (currentStream) {
currentStream.getTracks().forEach((track) => track.stop());
}
setStream(null);
setisListening(false);
}
function stopListening() {
cleanUp();
sendRecordingRef.current = false;
}
function handleLaptopIconClick() {
setAudioInput("device");
}
function handleMicrophoneIconClick() {
setAudioInput("mic");
}
return (
);
}
export default App;