Date: Wed, 25 Oct 2000 13:46:08 +0200 From: Khamba Staring <purrcat@edoropolis.org> To: freebsd-questions@freebsd.org Subject: ViBRA16C 16bit recording problems Message-ID: <200010251146.e9PBk9j06626@francine.edoropolis.org>
next in thread | raw e-mail | index | archive | help
Hi, I'm trying to record some music using a SoundBlaster ViBRA16C soundcard. I can record at various speeds (8000/22050/44100 etc Hz) both stereo and mono, but when I set the depth to 16 bits instead of 8, all I get is static. I used DAP for this and thought it was a DAP problem until I wrote a little record program myself (DAP can't record long plays; my code just reads /dev/dsp and puts the output directly in a file) but I got the same result (all speeds, mono/stereo recording works, but not with 16bits). dmesg outputs: -- sbc1: <Creative ViBRA16C> at port 0x220-0x22f,0x330-0x331,0x388-0x38b irq 5 drq 1,5 on isa0 sbc1: setting card to irq 5, drq 1, 5 pcm0: <SB DSP 4.13> on sbc1 -- IRQ 5, DRQ 1 and 5 are not used by any other device. As far as I can see all devices are properly linked: -- lrwxrwxrwx 1 root wheel 4 Oct 25 12:33 dsp -> dsp0 crw-rw-rw- 1 root wheel 30, 3 Oct 25 12:33 dsp0 lrwxrwxrwx 1 root wheel 5 Oct 25 12:33 dspW -> dspW0 crw-rw-rw- 1 root wheel 30, 5 Oct 25 12:33 dspW0 -- This is what my relevant code looks like: -- if((snddev = open(sd, O_RDONLY, 0)) == -1) { printf("error opening sound device %s: %s\n", sd, strerror(errno)); exit(-1); } if(s_depth == 16) { format = AFMT_U16_LE; printf("Setting device to 16 bits: "); if(ioctl(snddev, SNDCTL_DSP_SETFMT, &format) == -1) { printf("not succeeded: %s\n", strerror(errno)); exit(-1); } else printf("succeeded\n"); if(format != AFMT_U16_LE) { printf("not succeeded; format: %d\n", format); exit(-1); } } if(s_size == 2) { printf("Setting device to stereo: "); if(ioctl(snddev, SNDCTL_DSP_STEREO, &true) == -1) { printf("not succeeded: %s\n", strerror(errno)); exit(-1); } else printf("succeeded: %d\n", s_size); } printf("Setting speed to %d: ", s_rate); if(ioctl(snddev, SNDCTL_DSP_SPEED, &s_rate) == -1) { printf("not succeeded: %s\n", strerror(errno)); exit(-1); } else printf("succeeded: %d\n", s_rate); for(;;) { if((dev_read = read(snddev, sndbuf, bufsize)) == -1) { printf("error reading sound device file %s: %s\n", sd, strerror(errno)); sigint(); } if((file_written = fwrite(sndbuf, 1, dev_read, sndfile)) == 0) { printf("error writing to file %s\n", sf); sigint(); } } -- Of course I also opened the output file (sndfile), I used a 1024 bytes (bufsize) buffer (sndbuf). SIGINT is used to stop the recording; sigint() just closes the files and quits. The output looks like this: -- Setting device to 16 bits: succeeded Setting device to stereo: succeeded: 2 Setting speed to 44100: succeeded: 44100 -- Has anyone had the same problem? Or does anyone know where I should start looking for it? I also tried the Network Audio System, but wasn't able to produce a playable audio file (?!). Also, playing 16bit 44100 stereo audio streams works like a charm.. I don't understand it. Kind regards, -- Khamba Staring Ps: I'm not on the freebsd-questions mailing list. If you've got an answer, please also mail it to me.. To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-questions" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200010251146.e9PBk9j06626>