Понадобилось впиндюрить пикалку в программку на чистом С (ну может С99),
ну типа как у Аськи "а-аа", и очень не хочется приклеивать внешнюю библиотеку.В идеале, есть ли возможность воспроизвести WAV (только не MIDI),
перекодированный в HEX значения в виде массива int Wave[] = {...};,
и засланный в /dev/audioА может, вообще, можно так перекодировать WAV, чтоб заиграло через
fwrite(Wave, sizeof(Wave), sizeof(Wave), "/dev/dsp");???
> А может, вообще, можно так перекодировать WAV, чтоб заиграло через
> fwrite(Wave, sizeof(Wave), sizeof(Wave), "/dev/dsp");Там не WAV кодировать нужно, а дрочить /dev/dsp через ioctl: http://www.oreilly.de/catalog/multilinux/excerpt/ch14-05.htm
Вариантов попроще видится два - system (2) и далее по вкусу mpg321 и проч., либо пищать через \a через некоторые termio/termcap. Пробовал второй - терпимо.
>> А может, вообще, можно так перекодировать WAV, чтоб заиграло через
>> fwrite(Wave, sizeof(Wave), sizeof(Wave), "/dev/dsp");
> Там не WAV кодировать нужно, а дрочить /dev/dsp через ioctl: http://www.oreilly.de/catalog/multilinux/excerpt/ch14-05.htmУжо надрочил
:-P
>[оверквотинг удален]ТЛЯЯЯЯЯЯЯЯ ЗАРАБОТАЛО, СЛАВА МНЕ !!!!
Вот код, но обнаружился косяк - щелкает перед проигрыванием.
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <stdio.h>
#include <linux/soundcard.h>#include "sound.h"
int main(void)
{
int fd, arg, status, fmt, sz, div;fd = open("/dev/dsp", O_RDWR);
ioctl(fd, SOUND_PCM_RESET, 0);
arg = SIZE;
ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
arg = CHANNELS;
ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);
arg = RATE;
ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
fmt = AFMT_U16_BE;
ioctl(fd, SOUND_PCM_SETFMT, &fmt);printf("Play:\n");
sz = sizeof(Wave);
div = 4;
ioctl(fd, SOUND_PCM_SUBDIVIDE, &div);write(fd, Wave, sz);
ioctl(fd, SOUND_PCM_SYNC, 0);
close(fd);
return (0);
}"sound.h" - тут - http://pavlinux.ru/sound.h
В самом сэмпле смикшируй атаку и затухание. Затухание там нормальное, поэтому ты слышишь один щелчок, а не два.
> В самом сэмпле смикшируй атаку и затухание. Затухание там нормальное, поэтому ты
> слышишь один щелчок, а не два.Ну вот если только...
Вечером попробую.
> В самом сэмпле смикшируй атаку и затухание. Затухание там нормальное, поэтому ты
> слышишь один щелчок, а не два.Кстати, чем нынче модно WAV редактировать?
> В самом сэмпле смикшируй атаку и затухание. Затухание там нормальное, поэтому ты
> слышишь один щелчок, а не два.Хошь прикол?!
Я же когда WAV перегонял в HEX, заголовок WAV не удалил
То есть, там, в массиве, первые 44 байта надо выкинуть. :)ну и чуток поправил код, выкинул переменные не нужные.
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <stdio.h>
#include <linux/soundcard.h>#include "sound.h"
int main(void)
{
ssize_t arg;
int fd;fd = open("/dev/dsp", O_RDWR);
arg = 0; ioctl(fd, SOUND_PCM_SYNC, &arg);
arg = RATE; ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
arg = SIZE; ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
arg = CHANNELS; ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);
arg = AFMT_U16_BE; ioctl(fd, SOUND_PCM_SETFMT, &arg);
arg = 4; ioctl(fd, SOUND_PCM_SUBDIVIDE, &arg);
arg = (ssize_t)sizeof(Wave);write(fd, Wave, arg);
ioctl(fd, SOUND_PCM_SYNC, NULL);
ioctl(fd, SOUND_PCM_RESET, NULL);close(fd);
return 0;
}
> Понадобилось впиндюрить пикалку в программку на чистом С (ну может С99),
> ну типа как у Аськи "а-аа", и очень не хочется приклеивать внешнюю
> библиотеку.
> В идеале, есть ли возможность воспроизвести WAV (только не MIDI),
> перекодированный в HEX значения в виде массива int Wave[] = {...};,
> и засланный в /dev/audio
> А может, вообще, можно так перекодировать WAV, чтоб заиграло через
> fwrite(Wave, sizeof(Wave), sizeof(Wave), "/dev/dsp");
> ???можно к примеру так
sox test1.wav --comment "" -e u-law test1.au
dd bs=2k if=test1.au of=/dev/audio
или
cat test1.wav >/dev/audio
ну и там всякую фигню добавить со сжатием, а то файлы большие получаютсяну а записывать через дсп
sox -r 48000 -t ossdsp -w -s /dev/dsp -r 48000 sound1.wav
>[оверквотинг удален]
>> перекодированный в HEX значения в виде массива int Wave[] = {...};,
>> и засланный в /dev/audio
>> А может, вообще, можно так перекодировать WAV, чтоб заиграло через
>> fwrite(Wave, sizeof(Wave), sizeof(Wave), "/dev/dsp");
>> ???
> можно к примеру так
> sox test1.wav --comment "" -e u-law test1.au
> dd bs=2k if=test1.au of=/dev/audio
> или
> cat test1.wav >/dev/audioКстати, это я знаю, старая фишка, но пробовал и не заработало.
> ну и там всякую фигню добавить со сжатием, а то файлы большие получаются
> ну а записывать через дсп
> sox -r 48000 -t ossdsp -w -s /dev/dsp -r 48000 sound1.wavНу да... Спасибо, вроде разобрался.
Примеры, из сообщений выше, работают как надо!