@@ -136,34 +136,32 @@ unsigned int next_power_of_2(unsigned int n) {
136136}
137137
138138void * input_pipewire (void * audiodata ) {
139- struct pw_data data = {
140- 0 ,
141- };
139+ struct pw_data * data = (struct pw_data * )malloc (sizeof (struct pw_data ));
142140
143- data . cava_audio = (struct audio_data * )audiodata ;
141+ data -> cava_audio = (struct audio_data * )audiodata ;
144142 const struct spa_pod * params [1 ];
145- uint8_t buffer [data . cava_audio -> input_buffer_size ];
143+ uint8_t buffer [data -> cava_audio -> input_buffer_size ];
146144 struct pw_properties * props ;
147145 struct spa_pod_builder b = SPA_POD_BUILDER_INIT (buffer , sizeof (buffer ));
148146 uint32_t nom ;
149- nom = next_power_of_2 ((512 * data . cava_audio -> rate / 48000 ));
147+ nom = next_power_of_2 ((512 * data -> cava_audio -> rate / 48000 ));
150148 pw_init (0 , 0 );
151149
152- data . loop = pw_main_loop_new (NULL );
153- if (data . loop == NULL ) {
154- data . cava_audio -> terminate = 1 ;
155- sprintf (data . cava_audio -> error_message ,
150+ data -> loop = pw_main_loop_new (NULL );
151+ if (data -> loop == NULL ) {
152+ data -> cava_audio -> terminate = 1 ;
153+ sprintf (data -> cava_audio -> error_message ,
156154 __FILE__ ": Could not create main loop. Is your system running pipewire? Maybe try "
157155 "pulse input method instead." );
158156 return 0 ;
159157 }
160158
161- data . timer = pw_loop_add_timer (pw_main_loop_get_loop (data . loop ), on_timeout , & data );
159+ data -> timer = pw_loop_add_timer (pw_main_loop_get_loop (data -> loop ), on_timeout , data );
162160
163161 props = pw_properties_new (PW_KEY_MEDIA_TYPE , "Audio" , PW_KEY_MEDIA_CATEGORY , "Capture" ,
164162 PW_KEY_MEDIA_ROLE , "Music" , NULL );
165163
166- char * source = data . cava_audio -> source ;
164+ char * source = data -> cava_audio -> source ;
167165 size_t sourcelength = strlen (source );
168166
169167 if (8 <= sourcelength && !strcmp (source + sourcelength - 8 , ".monitor" )) {
@@ -175,19 +173,19 @@ void *input_pipewire(void *audiodata) {
175173 } else if (strcmp (source , "auto_input" ) != 0 ) {
176174 pw_properties_set (props , PW_KEY_TARGET_OBJECT , source );
177175 }
178- pw_properties_setf (props , PW_KEY_NODE_LATENCY , "%u/%u" , nom , data . cava_audio -> rate );
176+ pw_properties_setf (props , PW_KEY_NODE_LATENCY , "%u/%u" , nom , data -> cava_audio -> rate );
179177
180- if (data . cava_audio -> active )
178+ if (data -> cava_audio -> active )
181179 pw_properties_set (props , PW_KEY_NODE_ALWAYS_PROCESS , "true" );
182180 else
183181 pw_properties_set (props , PW_KEY_NODE_PASSIVE , "true" );
184182
185- if (data . cava_audio -> virtual_node )
183+ if (data -> cava_audio -> virtual_node )
186184 pw_properties_set (props , PW_KEY_NODE_VIRTUAL , "true" );
187185
188186 enum spa_audio_format audio_format = SPA_AUDIO_FORMAT_S16 ;
189187
190- switch (data . cava_audio -> format ) {
188+ switch (data -> cava_audio -> format ) {
191189 case 8 :
192190 audio_format = SPA_AUDIO_FORMAT_S8 ;
193191 break ;
@@ -202,53 +200,56 @@ void *input_pipewire(void *audiodata) {
202200 break ;
203201 };
204202
205- if (data . cava_audio -> remix ) {
203+ if (data -> cava_audio -> remix ) {
206204 pw_properties_set (props , PW_KEY_STREAM_DONT_REMIX , "false" );
207205 pw_properties_set (props , "channelmix.upmix" , "true" );
208206
209- if (data . cava_audio -> channels < 2 ) {
207+ if (data -> cava_audio -> channels < 2 ) {
210208 // N to 1 with all channels shown
211209 params [0 ] = spa_format_audio_raw_build (
212210 & b , SPA_PARAM_EnumFormat ,
213- & SPA_AUDIO_INFO_RAW_INIT (.format = audio_format , .rate = data . cava_audio -> rate ,
214- .channels = data . cava_audio -> channels , ));
211+ & SPA_AUDIO_INFO_RAW_INIT (.format = audio_format , .rate = data -> cava_audio -> rate ,
212+ .channels = data -> cava_audio -> channels , ));
215213 } else {
216214 // N to 2 with all channels shown
217215 params [0 ] = spa_format_audio_raw_build (
218216 & b , SPA_PARAM_EnumFormat ,
219- & SPA_AUDIO_INFO_RAW_INIT (.format = audio_format , .rate = data . cava_audio -> rate ,
220- .channels = data . cava_audio -> channels ,
217+ & SPA_AUDIO_INFO_RAW_INIT (.format = audio_format , .rate = data -> cava_audio -> rate ,
218+ .channels = data -> cava_audio -> channels ,
221219 .position = {SPA_AUDIO_CHANNEL_FL ,
222220 SPA_AUDIO_CHANNEL_FR }, ));
223221 }
224222 } else {
225223 // N to 2 with only FL and FR shown
226224 params [0 ] = spa_format_audio_raw_build (
227225 & b , SPA_PARAM_EnumFormat ,
228- & SPA_AUDIO_INFO_RAW_INIT (.format = audio_format , .rate = data . cava_audio -> rate ,
229- .channels = data . cava_audio -> channels , ));
226+ & SPA_AUDIO_INFO_RAW_INIT (.format = audio_format , .rate = data -> cava_audio -> rate ,
227+ .channels = data -> cava_audio -> channels , ));
230228 }
231229
232- data . stream = pw_stream_new_simple (pw_main_loop_get_loop (data . loop ), "cava" , props ,
233- & stream_events , & data );
230+ data -> stream = pw_stream_new_simple (pw_main_loop_get_loop (data -> loop ), "cava" , props ,
231+ & stream_events , data );
234232
235- int status = pw_stream_connect (data . stream , PW_DIRECTION_INPUT , PW_ID_ANY ,
233+ int status = pw_stream_connect (data -> stream , PW_DIRECTION_INPUT , PW_ID_ANY ,
236234 PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_MAP_BUFFERS |
237235 PW_STREAM_FLAG_RT_PROCESS ,
238236 params , 1 );
239237
240238 if (status < 0 ) {
241- data . cava_audio -> terminate = 1 ;
242- sprintf (data . cava_audio -> error_message ,
239+ data -> cava_audio -> terminate = 1 ;
240+ sprintf (data -> cava_audio -> error_message ,
243241 __FILE__ ": Could not connect stream. Is your system running pipewire? Maybe try "
244242 "pulse input method instead." );
245- return 0 ;
243+ goto error_free ;
246244 }
247245
248- pw_main_loop_run (data .loop );
249-
250- pw_stream_destroy (data .stream );
251- pw_main_loop_destroy (data .loop );
246+ pw_main_loop_run (data -> loop );
247+ pw_stream_destroy (data -> stream );
248+ error_free :
249+ pw_loop_destroy_source (pw_main_loop_get_loop (data -> loop ), data -> timer );
250+ pw_main_loop_destroy (data -> loop );
252251 pw_deinit ();
252+ free (data );
253+
253254 return 0 ;
254255}
0 commit comments