#include <linux/init.h>
 #include <sound/core.h>
 #include <sound/emu10k1.h>
+#include "p16v.h"
 
 static void snd_emu10k1_proc_spdif_status(emu10k1_t * emu,
                                          snd_info_buffer_t * buffer,
 
                if (rate_reg > 0) {
                        rate = snd_emu10k1_ptr_read(emu, rate_reg, 0);
+                       snd_iprintf(buffer, "S/PDIF Valid          : %s\n", rate & SRCS_SPDIFVALID ? "on" : "off");
                        snd_iprintf(buffer, "S/PDIF Locked         : %s\n", rate & SRCS_SPDIFLOCKED ? "on" : "off");
                        snd_iprintf(buffer, "Rate Locked           : %s\n", rate & SRCS_RATELOCKED ? "on" : "off");
                        /* From ((Rate * 48000 ) / 262144); */
 #endif
 }
 
+static void snd_emu10k1_proc_rates_read(snd_info_entry_t *entry, 
+                                 snd_info_buffer_t * buffer)
+{
+       static int samplerate[8] = { 44100, 48000, 96000, 192000, 4, 5, 6, 7 };
+       emu10k1_t *emu = entry->private_data;
+       unsigned int val, tmp, n;
+       val = snd_emu10k1_ptr20_read(emu, CAPTURE_RATE_STATUS, 0);
+       tmp = (val >> 16) & 0x8;
+       for (n=0;n<4;n++) {
+               tmp = val >> (16 + (n*4));
+               if (tmp & 0x8) snd_iprintf(buffer, "Channel %d: Rate=%d\n", n, samplerate[tmp & 0x7]);
+               else snd_iprintf(buffer, "Channel %d: No input\n", n);
+       }
+}
+
 static void snd_emu10k1_proc_acode_read(snd_info_entry_t *entry, 
                                        snd_info_buffer_t * buffer)
 {
                if (! snd_card_proc_new(emu->card, "spdif-in", &entry))
                        snd_info_set_text_ops(entry, emu, 2048, snd_emu10k1_proc_spdif_read);
        }
+       if (emu->card_capabilities->ca0151_chip) {
+               if (! snd_card_proc_new(emu->card, "capture-rates", &entry))
+                       snd_info_set_text_ops(entry, emu, 2048, snd_emu10k1_proc_rates_read);
+       }
 
        if (! snd_card_proc_new(emu->card, "voices", &entry))
                snd_info_set_text_ops(entry, emu, 2048, snd_emu10k1_proc_voices_read);
 
                                 SNDRV_PCM_INFO_BLOCK_TRANSFER |
                                 SNDRV_PCM_INFO_MMAP_VALID),
        .formats =              SNDRV_PCM_FMTBIT_S32_LE, /* Only supports 24-bit samples padded to 32 bits. */
-       .rates =                SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_48000 ,
-       .rate_min =             48000,
+       .rates =                SNDRV_PCM_RATE_192000 | SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_44100, 
+       .rate_min =             44100,
        .rate_max =             192000,
        .channels_min =         8, 
        .channels_max =         8,
        tmp = snd_emu10k1_ptr_read(emu, A_SPDIF_SAMPLERATE, channel);
         switch (runtime->rate) {
        case 44100:
-         snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, channel, (tmp & ~0xe000) | 0x8000); /* FIXME: This will change the capture rate as well! */
-         break;
-       case 48000:
-         snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, channel, (tmp & ~0xe000) | 0x0000); /* FIXME: This will change the capture rate as well! */
+         snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, channel, (tmp & ~0xe0e0) | 0x8080);
          break;
        case 96000:
-         snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, channel, (tmp & ~0xe000) | 0x4000); /* FIXME: This will change the capture rate as well! */
+         snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, channel, (tmp & ~0xe0e0) | 0x4040);
          break;
        case 192000:
-         snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, channel, (tmp & ~0xe000) | 0x2000); /* FIXME: This will change the capture rate as well! */
+         snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, channel, (tmp & ~0xe0e0) | 0x2020);
          break;
+       case 48000:
        default:
-         snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, channel, 0x0000); /* FIXME: This will change the capture rate as well! */
+         snd_emu10k1_ptr_write(emu, A_SPDIF_SAMPLERATE, channel, (tmp & ~0xe0e0) | 0x0000);
          break;
        }
        /* FIXME: Check emu->buffer.size before actually writing to it. */