ascii-chat 0.6.0
Real-time terminal-based video chat with ASCII art conversion
Loading...
Searching...
No Matches
wav_writer.h File Reference

Simple WAV file writer for audio debugging. More...

Go to the source code of this file.

Data Structures

struct  wav_writer_t
 WAV file writer context. More...
 

Functions

wav_writer_twav_writer_open (const char *filepath, int sample_rate, int channels)
 Open WAV file for writing.
 
int wav_writer_write (wav_writer_t *writer, const float *samples, int num_samples)
 Write audio samples to WAV file.
 
void wav_writer_close (wav_writer_t *writer)
 Close WAV file and finalize header.
 
bool wav_dump_enabled (void)
 Check if audio dumping is enabled via environment.
 

Detailed Description

Simple WAV file writer for audio debugging.

Provides utilities to dump audio buffers to WAV files for debugging. Enable with environment variable: ASCIICHAT_DUMP_AUDIO=1

Definition in file wav_writer.h.

Function Documentation

◆ wav_dump_enabled()

bool wav_dump_enabled ( void  )

Check if audio dumping is enabled via environment.

Returns
true if ASCIICHAT_DUMP_AUDIO=1

Definition at line 123 of file wav_writer.c.

123 {
124 const char *env = SAFE_GETENV("ASCIICHAT_DUMP_AUDIO");
125 return env && (strcmp(env, "1") == 0 || strcmp(env, "true") == 0);
126}
#define SAFE_GETENV(name)
Definition common.h:378

References SAFE_GETENV.

Referenced by audio_analysis_init(), and audio_client_init().

◆ wav_writer_close()

void wav_writer_close ( wav_writer_t writer)

Close WAV file and finalize header.

Parameters
writerWAV writer context

Definition at line 99 of file wav_writer.c.

99 {
100 if (!writer) {
101 return;
102 }
103
104 if (writer->file) {
105 // Update file size and data size in header
106 uint32_t data_size = (uint32_t)(writer->samples_written * sizeof(float));
107 uint32_t file_size = data_size + 36; // 36 = header size without RIFF chunk
108
109 // Seek to file size field (offset 4)
110 fseek(writer->file, 4, SEEK_SET);
111 fwrite(&file_size, sizeof(uint32_t), 1, writer->file);
112
113 // Seek to data size field (offset 40)
114 fseek(writer->file, 40, SEEK_SET);
115 fwrite(&data_size, sizeof(uint32_t), 1, writer->file);
116
117 fclose(writer->file);
118 }
119
120 SAFE_FREE(writer);
121}
unsigned int uint32_t
Definition common.h:58
#define SAFE_FREE(ptr)
Definition common.h:320
FILE * file
Definition wav_writer.h:24
size_t samples_written
Definition wav_writer.h:25

References wav_writer_t::file, SAFE_FREE, and wav_writer_t::samples_written.

Referenced by audio_analysis_cleanup(), audio_cleanup(), audio_client_init(), and client_audio_pipeline_destroy().

◆ wav_writer_open()

wav_writer_t * wav_writer_open ( const char *  filepath,
int  sample_rate,
int  channels 
)

Open WAV file for writing.

Parameters
filepathPath to WAV file to create
sample_rateSample rate (e.g., 44100)
channelsNumber of channels (1=mono, 2=stereo)
Returns
WAV writer context or NULL on error

Definition at line 39 of file wav_writer.c.

39 {
40 if (!filepath || sample_rate <= 0 || channels <= 0 || channels > 2) {
41 return NULL;
42 }
43
45 if (!writer) {
46 return NULL;
47 }
48
49 writer->file = fopen(filepath, "wb");
50 if (!writer->file) {
51 SAFE_FREE(writer);
52 return NULL;
53 }
54
55 writer->samples_written = 0;
56 writer->sample_rate = sample_rate;
57 writer->channels = channels;
58
59 // Write WAV header (we'll update sizes when closing)
60 wav_riff_header_t riff = {.riff = {'R', 'I', 'F', 'F'},
61 .file_size = 0, // Will update on close
62 .wave = {'W', 'A', 'V', 'E'}};
63
64 wav_fmt_chunk_t fmt = {.fmt = {'f', 'm', 't', ' '},
65 .chunk_size = 16,
66 .audio_format = 3, // IEEE float
67 .num_channels = (uint16_t)channels,
68 .sample_rate = (uint32_t)sample_rate,
69 .byte_rate = (uint32_t)(sample_rate * channels * sizeof(float)),
70 .block_align = (uint16_t)(channels * sizeof(float)),
71 .bits_per_sample = 32};
72
73 wav_data_header_t data = {
74 .data = {'d', 'a', 't', 'a'},
75 .data_size = 0 // Will update on close
76 };
77
78 fwrite(&riff, sizeof(riff), 1, writer->file);
79 fwrite(&fmt, sizeof(fmt), 1, writer->file);
80 fwrite(&data, sizeof(data), 1, writer->file);
81
82 return writer;
83}
unsigned short uint16_t
Definition common.h:57
#define SAFE_MALLOC(size, cast)
Definition common.h:208
WAV file writer context.
Definition wav_writer.h:23

References wav_writer_t::channels, wav_data_header_t::data, wav_writer_t::file, wav_fmt_chunk_t::fmt, wav_riff_header_t::riff, SAFE_FREE, SAFE_MALLOC, wav_writer_t::sample_rate, and wav_writer_t::samples_written.

Referenced by audio_analysis_init(), audio_client_init(), and client_audio_pipeline_create().

◆ wav_writer_write()

int wav_writer_write ( wav_writer_t writer,
const float *  samples,
int  num_samples 
)

Write audio samples to WAV file.

Parameters
writerWAV writer context
samplesFloat samples in range [-1.0, 1.0]
num_samplesNumber of samples to write
Returns
0 on success, -1 on error

Definition at line 85 of file wav_writer.c.

85 {
86 if (!writer || !writer->file || !samples || num_samples <= 0) {
87 return -1;
88 }
89
90 size_t written = fwrite(samples, sizeof(float), num_samples, writer->file);
91 if (written != (size_t)num_samples) {
92 return -1;
93 }
94
95 writer->samples_written += num_samples;
96 return 0;
97}

References wav_writer_t::file, and wav_writer_t::samples_written.

Referenced by audio_analysis_track_received_sample(), audio_analysis_track_sent_sample(), audio_process_received_samples(), and client_audio_pipeline_process_duplex().