audioserver/PulseAudio/3rd/vban.cpp
2024-06-21 08:22:20 +02:00

79 lines
1.7 KiB
C++

#include "vban.h"
#include "PulseAudioCPP.h"
#include <tuple>
VBAN_Stream::VBAN_Stream(std::string name, VBAN_CODEC codec, VBAN_SAMPLERATE samplerate, VBAN_DATATYPE datatype, uint8_t noChannels)
:m_FrameCounter(0)
,m_name(name)
{
m_header.vban = VBAN_MARKER;
for (int i = 0; i < 16; i++)
m_header.streamname[i] = m_name.size() > i ? m_name[i] : 0;
m_header.format_bit = datatype & 0xf;
m_header.format_nbc = noChannels-1;
m_header.format_SR = samplerate;
m_header.format_nbs = 0;
m_header.noFrame = 0;
}
VBAN_Stream::~VBAN_Stream()
{
}
int VBAN_Stream::encodePacket(char* packet, uint16_t packetSize)
{
//std::cout << "Encode Packet " << packetSize << std::endl;
auto total = packetSize + sizeof(VBAN_HEADER);
auto newPacket = new char[total];
std::cout << (void*)newPacket << std::endl;
m_header.format_nbs = (packetSize / 8)-1;
m_header.noFrame = m_FrameCounter;
for (int i = 0; i < sizeof(m_header); i++)
newPacket[i] = ((char*)&m_header)[i];
for (int i = 0; i < packetSize; i++)
newPacket[i + sizeof(VBAN_HEADER)] = packet[i];
m_FrameCounter++;
m_packetBuffer.push_back({ newPacket,total });
//m_packetReadyCB(this, newPacket, packetSize);
return 0;
}
int VBAN_Stream::decodePacket(char* packet, uint16_t packetSize)
{
return 0;
}
std::pair<char*, unsigned int>* VBAN_Stream::getLastPacket()
{
if (m_packetBuffer.size() == 0)
return NULL;
return &m_packetBuffer.front();
}
void VBAN_Stream::dropLastPacket()
{
if (m_packetBuffer.size() > 0)
{
//auto pack = m_packetBuffer.front();
m_packetBuffer.pop_front();
//delete[] pack.first;
}
}
void VBAN_Stream::update(Subject* s)
{
PulseAudioCPP* pulseStream = (PulseAudioCPP*)s;
encodePacket(pulseStream->getBuffer(), pulseStream->getBufferSize());
}