again, small updates

This commit is contained in:
2025-05-17 17:37:48 +02:00
parent 120f9a2467
commit befc2f12a8
2 changed files with 24 additions and 16 deletions
+1 -1
View File
@@ -39,7 +39,7 @@ Should run completly fine on a pi 5, fine on a pi 3b (30% cpu, 45% with lpf)
## Other Apps ## Other Apps
FM95 also includes some other apps, such as chimer95 which generates GTS tones each half hour, and dcf95 which creates a DCF77 compatible signal FM95 also includes some other apps, such as chimer95 which generates GTS tones each half hour, and dcf95 which creates a DCF77 compatible signal, and vban95 now which is a buffered VBAN receiver
## FM95 Calibration ## FM95 Calibration
+23 -15
View File
@@ -7,6 +7,10 @@
#include <sys/socket.h> #include <sys/socket.h>
#include <signal.h> #include <signal.h>
#define buffer_maxlength 12288
#define buffer_tlength_fragsize 12288
#define buffer_prebuf 8
#define VBAN_SR_MAXNUMBER 21 #define VBAN_SR_MAXNUMBER 21
static long VBAN_SRList[VBAN_SR_MAXNUMBER] = { static long VBAN_SRList[VBAN_SR_MAXNUMBER] = {
6000, 12000, 24000, 48000, 96000, 192000, 384000, 6000, 12000, 24000, 48000, 96000, 192000, 384000,
@@ -40,7 +44,7 @@ static char VBAN_TextBITList[VBAN_BIT_MAXNUMBER][4] = {
#define BUF_SIZE 2048 #define BUF_SIZE 2048
#define MAX_AUDIO_DATA_SIZE (BUF_SIZE - sizeof(VBANHeader)) #define MAX_AUDIO_DATA_SIZE (BUF_SIZE - sizeof(VBANHeader))
#define MAX_BUFFER_PACKETS 64 #define MAX_BUFFER_PACKETS 128
#pragma pack(1) #pragma pack(1)
typedef struct { typedef struct {
@@ -132,6 +136,7 @@ void process_audio_buffer(AudioBuffer* buffer, PulseOutputDevice* output_device)
} }
for(int i = 0; i < buffer->count; i++) { for(int i = 0; i < buffer->count; i++) {
// this function internally checks for initialization so no issues here, if not initialized then the data is discarded
write_PulseOutputDevicef(&output, buffer->packets[i].data, buffer->packets[i].size); write_PulseOutputDevicef(&output, buffer->packets[i].data, buffer->packets[i].size);
} }
@@ -202,7 +207,7 @@ int main(int argc, char *argv[]) {
signal(SIGTERM, stop); signal(SIGTERM, stop);
while (to_run) { while (to_run) {
ssize_t recv_len = recvfrom(sockfd, buffer, BUF_SIZE - 1, 0, ssize_t recv_len = recvfrom(sockfd, buffer, BUF_SIZE, 0,
(struct sockaddr *)&sender_addr, &sender_len); (struct sockaddr *)&sender_addr, &sender_len);
if (recv_len < 0) { if (recv_len < 0) {
perror("recvfrom"); perror("recvfrom");
@@ -228,12 +233,11 @@ int main(int argc, char *argv[]) {
uint32_t expected_frame = vban_frame + 1; uint32_t expected_frame = vban_frame + 1;
if (data.packet_data.frame_num != expected_frame) { if (data.packet_data.frame_num != expected_frame) {
uint32_t diff = data.packet_data.frame_num - expected_frame; int32_t diff = (int32_t)(data.packet_data.frame_num - expected_frame);
if (diff > 0) {
if (diff < 0x80000000) { printf("Dropped %d packet(s)\n", diff);
printf("Dropped %u packet(s)\n", diff); } else if (diff < 0) {
} else { printf("Late or duplicate packet\n");
printf("Packet out of order (late or duplicate)\n");
} }
vban_frame = data.packet_data.frame_num; vban_frame = data.packet_data.frame_num;
@@ -265,27 +269,30 @@ int main(int argc, char *argv[]) {
// Handle audio reset if needed // Handle audio reset if needed
if(vban_audio_reset) { if(vban_audio_reset) {
if (vban_last_sr >= VBAN_SR_MAXNUMBER || vban_last_format >= VBAN_BIT_MAXNUMBER) {
fprintf(stderr, "Unsupported sample rate or format\n");
continue;
}
if (output.initialized) { if (output.initialized) {
free_PulseOutputDevice(&output); free_PulseOutputDevice(&output);
} }
pa_buffer_attr buffer_attr = { pa_buffer_attr buffer_attr = {
.maxlength = (uint32_t) -1, .maxlength = buffer_maxlength,
.tlength = (uint32_t) -1, .tlength = buffer_tlength_fragsize,
.prebuf = (uint32_t) -1, .prebuf = buffer_prebuf
.minreq = (uint32_t) -1,
.fragsize = (uint32_t) -1
}; };
int result = init_PulseOutputDevicef( int result = init_PulseOutputDevicef(
&output, &output,
VBAN_SRList[vban_last_sr % VBAN_SR_MAXNUMBER], VBAN_SRList[vban_last_sr],
vban_last_channels + 1, // Add 1 because VBAN channels are 0-based vban_last_channels + 1, // Add 1 because VBAN channels are 0-based
"vban95", "vban95",
stream_name, stream_name,
pulse_device, pulse_device,
&buffer_attr, &buffer_attr,
VBAN_BITList[vban_last_format % VBAN_BIT_MAXNUMBER] VBAN_BITList[vban_last_format]
); );
if (result != 0) { if (result != 0) {
@@ -293,6 +300,7 @@ int main(int argc, char *argv[]) {
} }
vban_audio_reset = 0; vban_audio_reset = 0;
continue;
} }
char* audio_data = buffer + sizeof(VBANHeader); char* audio_data = buffer + sizeof(VBANHeader);