case 16:
                hwparams.format = SND_PCM_FORMAT_S16_LE;
                break;
+       case 24:
+               switch (LE_SHORT(f->byte_p_spl)) {
+               case 3:
+                       hwparams.format = SND_PCM_FORMAT_S24_3LE;
+                       break;
+               case 4:
+                       hwparams.format = SND_PCM_FORMAT_S24_LE;
+                       break;
+               default:
+                       error(" can't play WAVE-files with sample %d bits in %d bytes wide", LE_SHORT(f->bit_p_spl), LE_SHORT(f->byte_p_spl));
+                       break;
+               }
        case 32:
                hwparams.format = SND_PCM_FORMAT_S32_LE;
                break;
        case SND_PCM_FORMAT_S32_LE:
                bits = 32;
                break;
+       case SND_PCM_FORMAT_S24_LE:
+       case SND_PCM_FORMAT_S24_3LE:
+               bits = 24;
+               break;
        default:
                error("Wave doesn't support %s format...", snd_pcm_format_name(hwparams.format));
                exit(EXIT_FAILURE);
        f.byte_p_spl = LE_SHORT(tmp2);
        tmp = dsp_speed * hwparams.channels * (u_int) tmp2;
 #else
-       tmp2 = hwparams.channels * ((bits + 7) / 8);
+       tmp2 = hwparams.channels * snd_pcm_format_physical_width(hwparams.format) / 8;
        f.byte_p_spl = LE_SHORT(tmp2);
        tmp = (u_int) tmp2 * hwparams.rate;
 #endif