LINUX.ORG.RU

Sound Card Signal Generator


0

1

Пришлось тут свой усилитель поковырять, а кроме осцилографа под рукой ничего нет. Нужен просто генератор через sb.
Все что нагуглил либо очень страшное, либо древнее и работает только через oss. Либо 99% - win.
Соответственно чтоб можно было интерактивно через морду менять частоту и желательно форму.
Если на qt и через pulseaudio то вообще торт.
Есть у нас варианты?

★★★★★

Ответ на: комментарий от hbars

Есть ещё sfxr, но оно немного не для того предназначено, хотя тоже генератор.

post-factum ★★★★★ ()

работает только через oss

В alsa есть эмуляция OSS. А работает оно все через OSS потому, что «чистая alsa» — жуткое уродище. Код для OSS займет десяток строчек, а для ALSA — сотню.

Вот тебе простейшая синусоида:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <math.h>
#include <sys/time.h>
#include <error.h>

#include <sys/ioctl.h>
#include <sys/soundcard.h>

double dtime(){
	struct timeval ct;
	struct timezone tz;
	gettimeofday(&ct, &tz);
	return (ct.tv_sec + ct.tv_usec/1e6);
}

void play(double freq){
	double time0 = dtime();
	double time = 0.;
	unsigned short int A[2];
	int mask, status;
	int fd = open("/dev/dsp", O_RDWR);
	ioctl(fd, SOUND_MIXER_READ_STEREODEVS, &mask);
	printf("mask: %d\n", mask);
	mask = SOUND_MASK_VOLUME;
	ioctl(fd, SOUND_MIXER_WRITE_RECSRC, &mask);
	mask = AFMT_U16_BE;
	status = ioctl(fd, SNDCTL_DSP_SETFMT, &mask);
	if (status == -1) {
		perror("error from SNDCTL_DSP_SETFMT ioctl");
		exit(4);
	}
	mask = 8000;
	status = ioctl(fd, SOUND_PCM_WRITE_RATE, &mask);
	if (status == -1) {
		perror("error from SOUND_PCM_WRITE_RATE ioctl");
		exit(1);
	}
	ioctl(fd, SOUND_PCM_READ_BITS, &mask);
	printf("Разрядность: %d\n",mask);
	mask = 8;
	status = ioctl(fd, SOUND_PCM_WRITE_BITS, &mask);
	if (status == -1) {
		perror("error from SOUND_PCM_WRITE_BITS ioctl");
		exit(2);
	}
	status = ioctl(fd, SNDCTL_DSP_GETBLKSIZE, &mask);
	if (status == -1) {
		perror("error from SNDCTL_DSP_GETBLKSIZE ioctl");
		exit(3);
	}	
	printf("Размер блока: %d\n",mask);
	// wait for playback to complete before recording again 
		status = ioctl(fd, SOUND_PCM_SYNC, 0); 
		if (status == -1)
			perror("SOUND_PCM_SYNC ioctl failed");
	A[0] = A[1] = 0;
	do{
		time = dtime() - time0;
		A[0]= 0x4000 * (1. +  cos(time * freq * 2. * M_PI));
		write(fd, &A, sizeof(A));
		//usleep(10);
	}
	while( time < 0.5);
}

int main(int argc, char** argv){
	double freq;
	if (argc < 2) freq = 440;
	else freq = atof(argv[1]);
	printf("Playing 2 seconds with freq=%f Hz\n", freq);
	play(freq);
	exit(0);
}

Eddy_Em ☆☆☆☆☆ ()

Да, можно самому ничего не писать, если тебе тупые сигналы только нужны: используй sox.

Eddy_Em ☆☆☆☆☆ ()

работает только через oss

padsp спасет отца русской звукозаписи

lyset ★★★ ()
Ответ на: комментарий от registrant

octave жесть еще больше.
Audacity устроил.
Пищит как нужно. Разбираться пару минут.

hbars ★★★★★ ()
Ответ на: комментарий от Eddy_Em

В alsa есть эмуляция OSS. А работает оно все через OSS потому, что «чистая alsa» — жуткое уродище. Код для OSS займет десяток строчек, а для ALSA — сотню.

Есть. Но в убунте видимо оно не включено в ядре, а пересобирать влом.
Есть конечно padsp, но уже не нужно.
ps: А все-таки жаль что нет простого с нормальной мордой генератора, осцилографа через карту.
Это конечно г., но вот в моем случае, на пример, подошло бы.

hbars ★★★★★ ()
Ответ на: комментарий от hbars

Но в убунте видимо оно не включено в ядре

Элементарно:

modprobe snd_pcm_oss
modprobe snd_mixer_oss

padsp

Это не говно ли поцтеринговское часом?

А все-таки жаль что нет простого с нормальной мордой генератора, осцилографа через карту.

Дык, оно делается за полчаса! Хочешь — напиши, да выложи в открытый доступ. А возможно, и есть такое…

И вообще, ты почему sox не посмотрел?

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

Да, можно самому ничего не писать, если тебе тупые сигналы только нужны: используй sox.

Так все устраивало. Просто хотелось 21-го века с кнопками-ручками и мышкой. :)

hbars ★★★★★ ()
Ответ на: комментарий от Eddy_Em

padsp

Это не говно ли поцтеринговское часом?
Оно самое. От пульса.


root@hbars:~#
root@hbars:~# modprobe snd_pcm_oss
FATAL: Module snd_pcm_oss not found.

Я говорю. Нет их уже.
Хм. А вот mixer есть.

root@hbars:~# modprobe snd_mixer_oss
root@hbars:~# lsmod|grep oss
snd_mixer_oss 22602 0
snd 78855 28 snd_mixer_oss,saa7134_alsa,snd_usb_audio,snd_hda_codec_realtek,snd_hda_intel,snd_hda_codec,snd_pcm,snd_hwdep,snd_usbmidi_lib,snd_rawmidi,snd_seq,snd_timer,snd_seq_device

root@hbars:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 12.04.1 LTS
Release: 12.04
Codename: precise

hbars ★★★★★ ()
Ответ на: комментарий от hbars

Я говорю. Нет их уже.

Дык, не хрен бубунтой пользоваться. Поставь уже какой-нибудь дистрибутив линукса себе!!!

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от hbars

Debian? С него же бубунту сперли. Разницы не заметишь на первый взгляд, а качество будет выше во много крат!

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от anonymous

В бубунте? Работать? Не смеши мои тапочки!!!

Eddy_Em ☆☆☆☆☆ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.