71 {
72 switch (key) {
73
74 case KEY_QUESTION: {
75 if (display) {
77
79 }
80 break;
81 }
82
83
84 case KEY_ESCAPE: {
86
88 } else {
89
90
91 raise(SIGINT);
92 }
93 break;
94 }
95
96
97 case KEY_LEFT: {
98 if (capture) {
102 if (current_pos >= 0.0) {
103 double new_pos = current_pos - 30.0;
104 if (new_pos < 0.0) {
105 new_pos = 0.0;
106 }
108 if (err == ASCIICHAT_OK) {
109 log_info("Seeked backward to %.1f seconds", new_pos);
110 }
112 if (audio_ctx) {
114 }
115 }
116 }
117 }
118 break;
119 }
120
121 case KEY_RIGHT: {
122 if (capture) {
127 if (current_pos >= 0.0) {
128 double new_pos = current_pos + 30.0;
129
130 if (duration > 0.0 && new_pos > duration) {
131 new_pos = duration;
132 }
134 if (err == ASCIICHAT_OK) {
135 log_info("Seeked forward to %.1f seconds", new_pos);
136 }
138 if (audio_ctx) {
140 }
141 }
142 }
143 }
144 break;
145 }
146
147
148 case KEY_DOWN: {
149 double current_volume = GET_OPTION(speakers_volume);
150 double new_volume = clamp_volume(current_volume - 0.1);
152 double verify_volume = GET_OPTION(speakers_volume);
153 log_info("Volume DOWN: %.0f%% → %.0f%% (verified: %.0f%%)", current_volume * 100.0, new_volume * 100.0,
154 verify_volume * 100.0);
155 break;
156 }
157
158 case KEY_UP: {
159 double current_volume = GET_OPTION(speakers_volume);
160 double new_volume = clamp_volume(current_volume + 0.1);
162 double verify_volume = GET_OPTION(speakers_volume);
163 log_info("Volume UP: %.0f%% → %.0f%% (verified: %.0f%%)", current_volume * 100.0, new_volume * 100.0,
164 verify_volume * 100.0);
165 break;
166 }
167
168
169 case KEY_SPACE: {
170 if (capture) {
175 log_info("Paused");
176 } else {
177 log_info("Playing");
178 }
179 }
180 }
181 break;
182 }
183
184
185 case KEY_C: {
186 int current_mode = (int)GET_OPTION(color_mode);
187 int next_mode = next_color_mode(current_mode);
189
190 const char *mode_names[] = {"Mono", "16-color", "256-color", "Truecolor"};
191 if (next_mode >= 0 && next_mode <= 3) {
192 log_info("Color mode: %s", mode_names[next_mode]);
193 }
194 break;
195 }
196
197
198 case KEY_M: {
199 double current_volume = GET_OPTION(speakers_volume);
200 log_debug("Mute toggle: current_volume=%.2f, g_mute_saved_volume=%.2f, threshold=0.01", current_volume,
201 g_mute_saved_volume);
202
203 if (current_volume > 0.01) {
204
205 g_mute_saved_volume = current_volume;
207 double verify = GET_OPTION(speakers_volume);
208 log_info("Muted: saved %.0f%%, set to 0%% (verified: %.2f)", g_mute_saved_volume * 100.0, verify);
209 } else {
210
211 double restore_volume = g_mute_saved_volume > 0.0 ? g_mute_saved_volume : 0.5;
213 double verify = GET_OPTION(speakers_volume);
214 log_info("Unmuted: restored %.0f%% (verified: %.2f)", restore_volume * 100.0, verify);
215 }
216 break;
217 }
218
219
220 case KEY_F: {
221 bool current_flip_x = (
bool)GET_OPTION(flip_x);
223 log_info("Horizontal flip: %s", !current_flip_x ? "enabled" : "disabled");
224 break;
225 }
226
227
228#ifndef NDEBUG
229 case KEY_CTRL_L: {
231 log_debug("Lock state dump triggered via Ctrl+L");
232 break;
233 }
234#endif
235
236 default:
237
238 break;
239 }
240}
void session_display_render_help(session_display_ctx_t *ctx)
Render help screen centered on terminal.
void audio_flush_playback_buffers(audio_context_t *ctx)
void * session_capture_get_audio_context(session_capture_ctx_t *ctx)
void * session_capture_get_media_source(session_capture_ctx_t *ctx)
bool session_display_is_help_active(session_display_ctx_t *ctx)
Check if help screen is currently active (implemented in display.c for struct access)
void session_display_toggle_help(session_display_ctx_t *ctx)
Toggle help screen on/off (implemented in display.c for struct access)
void lock_debug_trigger_print(void)
asciichat_error_t options_set_int(const char *field_name, int value)
asciichat_error_t options_set_double(const char *field_name, double value)
asciichat_error_t options_set_bool(const char *field_name, bool value)
bool media_source_is_paused(media_source_t *source)
double media_source_get_position(media_source_t *source)
double media_source_get_duration(media_source_t *source)
asciichat_error_t media_source_seek(media_source_t *source, double timestamp_sec)
media_source_type_t media_source_get_type(media_source_t *source)
void media_source_toggle_pause(media_source_t *source)