The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Звук на C"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

"Звук на C"  +/
Сообщение от pavlinux (ok) on 11-Май-11, 02:06 
Понадобилось впиндюрить пикалку в программку на чистом С (ну может С99),
ну типа как у Аськи "а-аа", и очень не хочется приклеивать внешнюю библиотеку.

В идеале, есть ли возможность воспроизвести WAV (только не MIDI),
перекодированный в HEX значения в виде массива int Wave[] = {...};,
и засланный в /dev/audio

А может, вообще, можно так перекодировать WAV, чтоб заиграло через
fwrite(Wave,  sizeof(Wave), sizeof(Wave), "/dev/dsp");

???

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Звук на C"  +/
Сообщение от ACCA (ok) on 11-Май-11, 03:24 
> А может, вообще, можно так перекодировать 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. Пробовал второй - терпимо.


Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Звук на C"  +/
Сообщение от pavlinux (ok) on 11-Май-11, 04:02 
>> А может, вообще, можно так перекодировать WAV, чтоб заиграло через
>> fwrite(Wave,  sizeof(Wave), sizeof(Wave), "/dev/dsp");
> Там не WAV кодировать нужно, а дрочить /dev/dsp через ioctl: http://www.oreilly.de/catalog/multilinux/excerpt/ch14-05.htm

Ужо надрочил

:-P

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Звук на C"  +/
Сообщение от pavlinux (ok) on 11-Май-11, 04:09 
>[оверквотинг удален]

ТЛЯЯЯЯЯЯЯЯ ЗАРАБОТАЛО, СЛАВА МНЕ !!!!

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Звук на C"  +/
Сообщение от pavlinux (ok) on 12-Май-11, 02:59 
Вот код, но обнаружился косяк - щелкает перед проигрыванием.


#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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

5. "Звук на C"  +/
Сообщение от ACCA (ok) on 12-Май-11, 13:52 
В самом сэмпле смикшируй атаку и затухание. Затухание там нормальное, поэтому ты слышишь один щелчок, а не два.
Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "Звук на C"  +/
Сообщение от pavlinux (ok) on 12-Май-11, 14:11 
> В самом сэмпле смикшируй атаку и затухание. Затухание там нормальное, поэтому ты
> слышишь один щелчок, а не два.

Ну вот если только...
Вечером попробую.

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

7. "Звук на C"  +/
Сообщение от pavlinux (ok) on 12-Май-11, 17:50 
> В самом сэмпле смикшируй атаку и затухание. Затухание там нормальное, поэтому ты
> слышишь один щелчок, а не два.

Кстати, чем нынче модно WAV редактировать?

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

8. "Звук на C"  +/
Сообщение от pavlinux (ok) on 12-Май-11, 18:03 
> В самом сэмпле смикшируй атаку и затухание. Затухание там нормальное, поэтому ты
> слышишь один щелчок, а не два.

Хошь прикол?!

Я же когда WAV перегонял в HEX, заголовок WAV не удалил
То есть, там, в массиве, первые 44 байта надо выкинуть. :)

http://pavlinux.ru/sound.h

ну и чуток поправил код, выкинул переменные не нужные.


#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;
}


Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

9. "Звук на C"  +/
Сообщение от NuINu (??) on 12-Май-11, 18:20 
> Понадобилось впиндюрить пикалку в программку на чистом С (ну может С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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

10. "Звук на C"  +/
Сообщение от pavlinux (ok) on 12-Май-11, 18:24 
>[оверквотинг удален]
>> перекодированный в 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

Ну да... Спасибо, вроде разобрался.

Примеры, из сообщений выше, работают как надо!


Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру