diff --git a/src/sound.c b/src/sound.c
index 04a1651..7b4d984 100644
--- a/src/sound.c
+++ b/src/sound.c
@@ -15,36 +15,37 @@
 
 #if defined(FEAT_SOUND) || defined(PROTO)
 
-static long         sound_id = 0;
+static long sound_id = 0;
 
 // soundcb_T is typedef'ed in proto/sound.pro
 
-struct soundcb_S {
-    callback_T  snd_callback;
-#ifdef MSWIN
+struct soundcb_S
+{
+    callback_T snd_callback;
+# ifdef MSWIN
     MCIDEVICEID snd_device_id;
-    long        snd_id;
-#endif
-    soundcb_T   *snd_next;
+    long snd_id;
+# endif
+    soundcb_T *snd_next;
 };
 
-static soundcb_T    *first_callback = NULL;
+static soundcb_T *first_callback = NULL;
 
 /*
  * Return TRUE when a sound callback has been created, it may be invoked when
  * the sound finishes playing.  Also see has_sound_callback_in_queue().
  */
-    int
+int
 has_any_sound_callback(void)
 {
     return first_callback != NULL;
 }
 
-    static soundcb_T *
+static soundcb_T *
 get_sound_callback(typval_T *arg)
 {
-    callback_T  callback;
-    soundcb_T   *soundcb;
+    callback_T callback;
+    soundcb_T *soundcb;
 
     if (arg->v_type == VAR_UNKNOWN)
         return NULL;
@@ -70,11 +71,11 @@
 /*
  * Call "soundcb" with proper parameters.
  */
-    void
+void
 call_sound_callback(soundcb_T *soundcb, long snd_id, int result)
 {
-    typval_T    argv[3];
-    typval_T    rettv;
+    typval_T argv[3];
+    typval_T rettv;
 
     argv[0].v_type = VAR_NUMBER;
     argv[0].vval.v_number = snd_id;
@@ -89,11 +90,11 @@
 /*
  * Delete "soundcb" from the list of pending callbacks.
  */
-    void
+void
 delete_sound_callback(soundcb_T *soundcb)
 {
-    soundcb_T   *p;
-    soundcb_T   *prev = NULL;
+    soundcb_T *p;
+    soundcb_T *prev = NULL;
 
     for (p = first_callback; p != NULL; prev = p, p = p->snd_next)
         if (p == soundcb)
@@ -108,23 +109,24 @@
         }
 }
 
-#if defined(HAVE_CANBERRA) || defined(PROTO)
+# if defined(HAVE_CANBERRA) || defined(PROTO)
 
 /*
  * Sound implementation for Linux/Unix using libcanberra.
  */
-# include <canberra.h>
+#  include <canberra.h>
 
-static ca_context   *context = NULL;
+static ca_context *context = NULL;
 
 // Structure to store info about a sound callback to be invoked soon.
 typedef struct soundcb_queue_S soundcb_queue_T;
 
-struct soundcb_queue_S {
-    soundcb_queue_T     *scb_next;
-    uint32_t            scb_id;         // ID of the sound
-    int                 scb_result;     // CA_ value
-    soundcb_T           *scb_callback;  // function to call
+struct soundcb_queue_S
+{
+    soundcb_queue_T *scb_next;
+    uint32_t scb_id; // ID of the sound
+    int scb_result; // CA_ value
+    soundcb_T *scb_callback; // function to call
 };
 
 // Queue of callbacks to invoke from the main loop.
@@ -135,14 +137,13 @@
  * That is because the callback may be called from another thread and invoking
  * another sound function may cause trouble.
  */
-    static void
-sound_callback(
-        ca_context  *c UNUSED,
-        uint32_t    id,
-        int         error_code,
-        void        *userdata)
+static void
+sound_callback(ca_context *c UNUSED,
+               uint32_t id,
+               int error_code,
+               void *userdata)
 {
-    soundcb_T       *soundcb = (soundcb_T *)userdata;
+    soundcb_T *soundcb = (soundcb_T *)userdata;
     soundcb_queue_T *scb;
 
     scb = ALLOC_ONE(soundcb_queue_T);
@@ -152,16 +153,17 @@
     callback_queue = scb;
     scb->scb_id = id;
     scb->scb_result = error_code == CA_SUCCESS ? 0
-                          : error_code == CA_ERROR_CANCELED
-                                            || error_code == CA_ERROR_DESTROYED
-                          ? 1 : 2;
+                      : error_code == CA_ERROR_CANCELED ||
+                              error_code == CA_ERROR_DESTROYED
+                          ? 1
+                          : 2;
     scb->scb_callback = soundcb;
 }
 
 /*
  * Return TRUE if there is a sound callback to be called.
  */
-    int
+int
 has_sound_callback_in_queue(void)
 {
     return callback_queue != NULL;
@@ -170,7 +172,7 @@
 /*
  * Invoke queued sound callbacks.
  */
-    void
+void
 invoke_sound_callback(void)
 {
     soundcb_queue_T *scb;
@@ -188,7 +190,7 @@
     redraw_after_callback(TRUE, FALSE);
 }
 
-    static void
+static void
 sound_play_common(typval_T *argvars, typval_T *rettv, int playfile)
 {
     if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
@@ -199,17 +201,17 @@
     if (context == NULL)
         return;
 
-    soundcb_T   *soundcb = get_sound_callback(&argvars[1]);
-    int         res = CA_ERROR_INVALID;
+    soundcb_T *soundcb = get_sound_callback(&argvars[1]);
+    int res = CA_ERROR_INVALID;
 
     ++sound_id;
     if (soundcb == NULL)
     {
         res = ca_context_play(context, sound_id,
-                playfile ? CA_PROP_MEDIA_FILENAME : CA_PROP_EVENT_ID,
-                tv_get_string(&argvars[0]),
-                CA_PROP_CANBERRA_CACHE_CONTROL, "volatile",
-                NULL);
+                              playfile ? CA_PROP_MEDIA_FILENAME
+                                       : CA_PROP_EVENT_ID,
+                              tv_get_string(&argvars[0]),
+                              CA_PROP_CANBERRA_CACHE_CONTROL, "volatile", NULL);
     }
     else
     {
@@ -220,14 +222,14 @@
         {
             if (playfile)
                 ca_proplist_sets(proplist, CA_PROP_MEDIA_FILENAME,
-                        (char *)tv_get_string(&argvars[0]));
+                                 (char *)tv_get_string(&argvars[0]));
             else
                 ca_proplist_sets(proplist, CA_PROP_EVENT_ID,
-                        (char *)tv_get_string(&argvars[0]));
+                                 (char *)tv_get_string(&argvars[0]));
             ca_proplist_sets(proplist, CA_PROP_CANBERRA_CACHE_CONTROL,
-                    "volatile");
+                             "volatile");
             res = ca_context_play_full(context, sound_id, proplist,
-                    sound_callback, soundcb);
+                                       sound_callback, soundcb);
             if (res != CA_SUCCESS)
                 delete_sound_callback(soundcb);
 
@@ -237,7 +239,7 @@
     rettv->vval.v_number = res == CA_SUCCESS ? sound_id : 0;
 }
 
-    void
+void
 f_sound_playevent(typval_T *argvars, typval_T *rettv)
 {
     sound_play_common(argvars, rettv, FALSE);
@@ -246,7 +248,7 @@
 /*
  * implementation of sound_playfile({path} [, {callback}])
  */
-    void
+void
 f_sound_playfile(typval_T *argvars, typval_T *rettv)
 {
     sound_play_common(argvars, rettv, TRUE);
@@ -255,7 +257,7 @@
 /*
  * implementation of sound_stop({id})
  */
-    void
+void
 f_sound_stop(typval_T *argvars, typval_T *rettv UNUSED)
 {
     if (in_vim9script() && check_for_number_arg(argvars, 0) == FAIL)
@@ -268,7 +270,7 @@
 /*
  * implementation of sound_clear()
  */
-    void
+void
 f_sound_clear(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
     if (context == NULL)
@@ -277,8 +279,8 @@
     context = NULL;
 }
 
-# if defined(EXITFREE) || defined(PROTO)
-    void
+#  if defined(EXITFREE) || defined(PROTO)
+void
 sound_free(void)
 {
     soundcb_queue_T *scb;
@@ -297,9 +299,9 @@
         vim_free(scb);
     }
 }
-# endif
+#  endif
 
-#elif defined(MSWIN)
+# elif defined(MSWIN)
 
 /*
  * Sound implementation for MS-Windows.
@@ -307,30 +309,30 @@
 
 static HWND g_hWndSound = NULL;
 
-    static LRESULT CALLBACK
+static LRESULT CALLBACK
 sound_wndproc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 {
-    soundcb_T   *p;
+    soundcb_T *p;
 
     switch (message)
     {
         case MM_MCINOTIFY:
             for (p = first_callback; p != NULL; p = p->snd_next)
-                if (p->snd_device_id == (MCIDEVICEID) lParam)
+                if (p->snd_device_id == (MCIDEVICEID)lParam)
                 {
-                    char        buf[32];
+                    char buf[32];
 
                     vim_snprintf(buf, sizeof(buf), "close sound%06ld",
-                                                                p->snd_id);
+                                 p->snd_id);
                     mciSendStringA(buf, NULL, 0, 0);
 
-                    long result =   wParam == MCI_NOTIFY_SUCCESSFUL ? 0
-                                  : wParam == MCI_NOTIFY_ABORTED ? 1 : 2;
+                    long result = wParam == MCI_NOTIFY_SUCCESSFUL ? 0
+                                  : wParam == MCI_NOTIFY_ABORTED  ? 1
+                                                                  : 2;
                     call_sound_callback(p, p->snd_id, result);
 
                     delete_sound_callback(p);
                     redraw_after_callback(TRUE, FALSE);
-
                 }
             break;
     }
@@ -338,26 +340,26 @@
     return DefWindowProc(hwnd, message, wParam, lParam);
 }
 
-    static HWND
+static HWND
 sound_window(void)
 {
     if (g_hWndSound == NULL)
     {
         LPCSTR clazz = "VimSound";
-        WNDCLASS wndclass = {
-            0, sound_wndproc, 0, 0, g_hinst, NULL, 0, 0, NULL, clazz };
+        WNDCLASS wndclass = { 0, sound_wndproc, 0,    0, g_hinst, NULL, 0,
+                              0, NULL,          clazz };
         RegisterClass(&wndclass);
-        g_hWndSound = CreateWindow(clazz, NULL, 0, 0, 0, 0, 0,
-                HWND_MESSAGE, NULL, g_hinst, NULL);
+        g_hWndSound = CreateWindow(clazz, NULL, 0, 0, 0, 0, 0, HWND_MESSAGE,
+                                   NULL, g_hinst, NULL);
     }
 
     return g_hWndSound;
 }
 
-    void
+void
 f_sound_playevent(typval_T *argvars, typval_T *rettv)
 {
-    WCHAR           *wp;
+    WCHAR *wp;
 
     if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
         return;
@@ -371,16 +373,16 @@
     free(wp);
 }
 
-    void
+void
 f_sound_playfile(typval_T *argvars, typval_T *rettv)
 {
-    long        newid = sound_id + 1;
-    size_t      len;
-    char_u      *p, *filename;
-    WCHAR       *wp;
-    soundcb_T   *soundcb;
-    char        buf[32];
-    MCIERROR    err;
+    long newid = sound_id + 1;
+    size_t len;
+    char_u *p, *filename;
+    WCHAR *wp;
+    soundcb_T *soundcb;
+    char buf[32];
+    MCIERROR err;
 
     if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
         return;
@@ -393,7 +395,8 @@
     {
         return;
     }
-    vim_snprintf((char *)p, len, "open \"%s\" alias sound%06ld", filename, newid);
+    vim_snprintf((char *)p, len, "open \"%s\" alias sound%06ld", filename,
+                 newid);
 
     wp = enc_to_utf16((char_u *)p, NULL);
     free(p);
@@ -427,11 +430,11 @@
     mciSendStringA(buf, NULL, 0, NULL);
 }
 
-    void
+void
 f_sound_stop(typval_T *argvars, typval_T *rettv UNUSED)
 {
-    long    id;
-    char    buf[32];
+    long id;
+    char buf[32];
 
     if (in_vim9script() && check_for_number_arg(argvars, 0) == FAIL)
         return;
@@ -441,15 +444,15 @@
     mciSendStringA(buf, NULL, 0, NULL);
 }
 
-    void
+void
 f_sound_clear(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
     PlaySoundW(NULL, NULL, 0);
     mciSendStringA("close all", NULL, 0, NULL);
 }
 
-# if defined(EXITFREE)
-    void
+#  if defined(EXITFREE)
+void
 sound_free(void)
 {
     CloseWindow(g_hWndSound);
@@ -457,12 +460,12 @@
     while (first_callback != NULL)
         delete_sound_callback(first_callback);
 }
-# endif
+#  endif
 
-#elif defined(MACOS_X_DARWIN)
+# elif defined(MACOS_X_DARWIN)
 
 // Sound implementation for macOS.
-    static void
+static void
 sound_play_common(typval_T *argvars, typval_T *rettv, bool playfile)
 {
     if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
@@ -481,19 +484,19 @@
     rettv->vval.v_number = play_success ? sound_id : 0;
 }
 
-    void
+void
 f_sound_playevent(typval_T *argvars, typval_T *rettv)
 {
     sound_play_common(argvars, rettv, false);
 }
 
-    void
+void
 f_sound_playfile(typval_T *argvars, typval_T *rettv)
 {
     sound_play_common(argvars, rettv, true);
 }
 
-    void
+void
 f_sound_stop(typval_T *argvars, typval_T *rettv UNUSED)
 {
     if (in_vim9script() && check_for_number_arg(argvars, 0) == FAIL)
@@ -501,22 +504,22 @@
     sound_mch_stop(tv_get_number(&argvars[0]));
 }
 
-    void
+void
 f_sound_clear(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
     sound_mch_clear();
 }
 
-#if defined(EXITFREE) || defined(PROTO)
-    void
+#  if defined(EXITFREE) || defined(PROTO)
+void
 sound_free(void)
 {
     sound_mch_free();
     while (first_callback != NULL)
         delete_sound_callback(first_callback);
 }
-#endif
+#  endif
 
-#endif // MACOS_X_DARWIN
+# endif // MACOS_X_DARWIN
 
-#endif  // FEAT_SOUND
+#endif // FEAT_SOUND
