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

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

Go to the source code of this file.

Data Structures

struct  wav_riff_header_t
 
struct  wav_fmt_chunk_t
 
struct  wav_data_header_t
 

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 implementation for audio debugging.

Definition in file wav_writer.c.

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().