Babel  1
The voip software that only works on your local network
Loading...
Searching...
No Matches
Audio.cpp
Go to the documentation of this file.
1/*
2** EPITECH PROJECT, 2024
3** epitech-ratrappage-babel (Workspace)
4** File description:
5** audio.cpp
6*/
7
13#include "Audio/Audio.hpp"
14
15std::mutex _inMutex{};
16std::mutex _outMutex{};
17
19{
20 PRETTY_INFO << "Starting PortAudio" << std::endl;
21 PaError err;
22
23 err = Pa_Initialize();
24 if (err != paNoError)
25 throw std::runtime_error("Error PortAudio initialize!\n");
26 initInputParameters();
27 initOutputParameters();
28 PRETTY_INFO << "PortAudio started" << std::endl;
29}
30
32{
33 PRETTY_INFO << "Stopping PortAudio" << std::endl;
34 Pa_CloseStream(_inputStream);
35 Pa_CloseStream(_outputStream);
36 Pa_Terminate();
37 PRETTY_INFO << "PortAudio stopped" << std::endl;
38}
39
43void PortAudio::initInputParameters()
44{
45 PRETTY_INFO << "Initialising input parameters" << std::endl;
46 PaError err;
47
48 _inputParameters.device = Pa_GetDefaultInputDevice();
49 if (_inputParameters.device == paNoDevice)
50 throw std::runtime_error("Error: No default input device.\n");
51 _inputParameters.channelCount = 1;
52 _inputParameters.sampleFormat = paFloat32;
53 _inputParameters.suggestedLatency = Pa_GetDeviceInfo(_inputParameters.device)->defaultLowInputLatency;
54 _inputParameters.hostApiSpecificStreamInfo = NULL;
55
56 err = Pa_OpenStream(
57 &_inputStream,
58 &_inputParameters,
59 NULL,
60 SAMPLE_RATE,
61 FRAMES_PER_BUFFER,
62 paClipOff,
63 inputCallback,
64 &_inputBuffer);
65
66 if (err != paNoError)
67 throw std::runtime_error("Cannot open input Stream\n");
68 PRETTY_INFO << "Input parameters initialised" << std::endl;
69}
70
74void PortAudio::initOutputParameters()
75{
76
77 PRETTY_INFO << "Initialising output parameters" << std::endl;
78 PaError err;
79
80 _outputParameters.device = Pa_GetDefaultOutputDevice();
81 if (_outputParameters.device == paNoDevice)
82 throw std::runtime_error("Error: No default output device.\n");
83 _outputParameters.channelCount = 1;
84 _outputParameters.sampleFormat = paFloat32;
85 _outputParameters.suggestedLatency = Pa_GetDeviceInfo(_outputParameters.device)->defaultLowOutputLatency;
86 _outputParameters.hostApiSpecificStreamInfo = NULL;
87
88 err = Pa_OpenStream(
89 &_outputStream,
90 NULL,
91 &_outputParameters,
92 SAMPLE_RATE,
93 FRAMES_PER_BUFFER,
94 paClipOff,
95 outputCallback,
96 &_outputBuffer);
97
98 if (err != paNoError)
99 throw std::runtime_error("Cannot open input Stream\n");
100 PRETTY_INFO << "Output parameters initialised" << std::endl;
101}
102
107{
108 PRETTY_INFO << "Starting play" << std::endl;
109 PaError err;
110 err = Pa_StartStream(_outputStream);
111 if (err != paNoError) {
112 throw std::runtime_error("Unable to start output stream\n");
113 }
114 PRETTY_INFO << "Play started" << std::endl;
115}
116
121{
122 PRETTY_INFO << "Stopping play" << std::endl;
123 PaError err = Pa_StopStream(_outputStream);
124 if (err != paStreamIsStopped && err != paNoError) {
125 throw std::runtime_error("Unable to stop output stream\n");
126 }
127 PRETTY_INFO << "Play stopped" << std::endl;
128}
129
134{
135 PRETTY_INFO << "Starting record" << std::endl;
136 PaError err;
137 err = Pa_StartStream(_inputStream);
138 if (err != paNoError) {
139 throw std::runtime_error("Unable to start input stream\n");
140 }
141 PRETTY_INFO << "Record started" << std::endl;
142}
143
148{
149 PRETTY_INFO << "Stopping record" << std::endl;
150 PaError err = Pa_StopStream(_inputStream);
151 if (err != paStreamIsStopped && err != paNoError) {
152 throw std::runtime_error("Unable to stop input stream\n");
153 }
154 PRETTY_INFO << "Record stopped" << std::endl;
155}
156
164bool PortAudio::getSound(std::vector<float> &soundVector, int packetSize)
165{
166 PRETTY_INFO << "Getting sound" << std::endl;
167 if (packetSize > (int)_inputBuffer.size())
168 return false;
169 _inMutex.lock();
170 for (int i = 0; i != packetSize; i++) {
171 soundVector.push_back(_inputBuffer[i]);
172 }
173 for (int i = 0; i != packetSize; i++)
174 _inputBuffer.pop_front();
175 _inMutex.unlock();
176 PRETTY_INFO << "Sound size is " << soundVector.size() << std::endl;
177 return true;
178}
179
185void PortAudio::setPlaySound(const std::vector<float> &soundVector)
186{
187 PRETTY_INFO << "Setting sound" << std::endl;
188 _outMutex.lock();
189 for (size_t i = 0; i != soundVector.size(); i++) {
190 _outputBuffer.push_back(soundVector[i]);
191 }
192 _outMutex.unlock();
193 PRETTY_INFO << "Sound set" << std::endl;
194}
195
200{
201 PRETTY_INFO << "Resetting buffers" << std::endl;
202 _inputBuffer.clear();
203 _outputBuffer.clear();
204 PRETTY_INFO << "Buffers reset" << std::endl;
205}
std::mutex _inMutex
Definition Audio.cpp:15
std::mutex _outMutex
Definition Audio.cpp:16
Declares the PortAudio class for handling audio playback and recording using PortAudio.
std::mutex _inMutex
Definition Audio.cpp:15
std::mutex _outMutex
Definition Audio.cpp:16
#define PRETTY_INFO
Info log with details and colour.
void play()
Start audio playback.
Definition Audio.cpp:106
~PortAudio()
Destroy the PortAudio object.
Definition Audio.cpp:31
void setPlaySound(const std::vector< float > &soundVector)
Set the sound data to be played.
Definition Audio.cpp:185
void stopPlay()
Stop audio playback.
Definition Audio.cpp:120
bool getSound(std::vector< float > &soundVector, int packetSize)
Get recorded sound data.
Definition Audio.cpp:164
void record()
Start audio recording.
Definition Audio.cpp:133
PortAudio()
Construct a new PortAudio object.
Definition Audio.cpp:18
void resetBuffers()
Reset the input and output buffers.
Definition Audio.cpp:199
void stopRecord()
Stop audio recording.
Definition Audio.cpp:147