The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Звук на C, !*! pavlinux, 11-Май-11, 02:06  [смотреть все]
Понадобилось впиндюрить пикалку в программку на чистом С (ну может С99),
ну типа как у Аськи "а-аа", и очень не хочется приклеивать внешнюю библиотеку.

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

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

???

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


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


    #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

    • Звук на C, !*! ACCA, 13:52 , 12-Май-11 (5)
      В самом сэмпле смикшируй атаку и затухание. Затухание там нормальное, поэтому ты слышишь один щелчок, а не два.
      • Звук на C, !*! pavlinux, 14:11 , 12-Май-11 (6)
        > В самом сэмпле смикшируй атаку и затухание. Затухание там нормальное, поэтому ты
        > слышишь один щелчок, а не два.

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

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

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

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

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

        Я же когда 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;
        }


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

    • Звук на C, !*! pavlinux, 18:24 , 12-Май-11 (10)
      >[оверквотинг удален]
      >> перекодированный в 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

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

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





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

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