Babel  1
The voip software that only works on your local network
Loading...
Searching...
No Matches
Audio.hpp
Go to the documentation of this file.
1/*
2** EPITECH PROJECT, 2024
3** epitech-ratrappage-babel (Workspace)
4** File description:
5** audio.hpp
6*/
7
13#pragma once
14#include <deque>
15#include <mutex>
16#include <vector>
17#include <iostream>
18#include <exception>
19#include <portaudio.h>
20#include "Logging.hpp"
21#include "Constants.hpp"
22
23extern std::mutex _inMutex;
24extern std::mutex _outMutex;
25
29class PortAudio {
30 public:
34 PortAudio();
35
39 ~PortAudio();
40
44 void play();
45
49 void stopPlay();
50
54 void record();
55
59 void stopRecord();
60
69 bool getSound(std::vector<float> &soundVector, int packetSize);
70
76 void setPlaySound(const std::vector<float> &soundVector);
77
81 void resetBuffers();
82
83 private:
84 PaStream *_inputStream;
85 PaStream *_outputStream;
86 PaStreamParameters _inputParameters;
87 PaStreamParameters _outputParameters;
88 std::deque<float> _inputBuffer;
89 std::deque<float> _outputBuffer;
90
94 void initInputParameters();
95
99 void initOutputParameters();
100
112 static int inputCallback(const void *inputBuffer, void *outputBuffer,
113 unsigned long framesPerBuffer,
114 const PaStreamCallbackTimeInfo *timeInfo,
115 PaStreamCallbackFlags statusFlags,
116 void *userData)
117 {
118 (void)outputBuffer;
119 (void)timeInfo;
120 (void)statusFlags;
121 (void)userData;
122
123 try {
124 _inMutex.lock();
125 std::deque<float> *inputData = static_cast<std::deque<float> *>(userData);
126
127 float *input = (float *)inputBuffer;
128
129 for (unsigned long i = 0; i < framesPerBuffer; i++) {
130 inputData->push_back(*input++);
131 }
132 _inMutex.unlock();
133 return paContinue;
134 }
135 catch (std::exception &e) {
136 throw e;
137 }
138 };
139
151 static int outputCallback(const void *inputBuffer, void *outputBuffer,
152 unsigned long framesPerBuffer,
153 const PaStreamCallbackTimeInfo *timeInfo,
154 PaStreamCallbackFlags statusFlags,
155 void *userData)
156 {
157 (void)inputBuffer;
158 (void)timeInfo;
159 (void)statusFlags;
160 (void)userData;
161 unsigned long i = 0;
162
163 try {
164 float *output = (float *)outputBuffer;
165 std::deque<float> *outputData = static_cast<std::deque<float> *>(userData);
166
167 if (outputData->empty())
168 return paContinue;
169 _outMutex.lock();
170 for (; i < framesPerBuffer; i++) {
171 if (outputData->empty())
172 break;
173 *output++ = (*outputData)[i];
174 }
175 for (unsigned long j = 0; j != i; j++) {
176 outputData->pop_front();
177 }
178 _outMutex.unlock();
179 return paContinue;
180 }
181 catch (std::exception &e) {
182 throw std::runtime_error(e.what());
183 }
184 };
185};
std::mutex _inMutex
Definition Audio.cpp:15
std::mutex _outMutex
Definition Audio.cpp:16
Defines various constants used throughout the project.
Aggregates logging-related headers.
Class for handling audio playback and recording using PortAudio.
Definition Audio.hpp:29
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