7.1 내부 스피커 프로그래밍 (Programming the internal speaker)
믿거나 말거나, PC 스피커는 리눅스 콘솔(Console)의 부분이고 그러므로
문자장치 (character device)이다. 따라서, ioctl() 요청들(requests)은
그것을 조종하기 위해 존재한다. 내부 스피커에 대해 다음 2개의 요청
(request)이 있다.
KDMKTONE
커널 타이머를 사용하여 지정된 시간에 소리(beep)를 발생시킨다.
예제 ioctl (fd, KDMKTONE, (long) argument)
KIOCSOUND
현재 울리고 있는 소리(beep)를 멈추거나 끝없이 소리(beep)를 발생시킨
다.
예제 ioctl (fd, KIOCSOUND, (int) tone)
아규먼트(argument)는 low word에 있는 톤(tone)과 high word에 있는 지속
성(duration)의 값으로 이루어진다. 톤(tone) 값은 주파수가 아니다. PC
메인보드 타이머 (mainboard timer) 8254는 1.19 MHz의 clock을 사용하고
이는 1190000/주파수 를 의미한다. 지속성(duration)은 타이머의 똑딱임으
로 측정된다. 두개의 ioctl 호출은 즉각적으로 반환됨으로 프로그램을 차
단하지 않고 소리(beep)를 제공하는 방법이 될 수 있다.
KDMKTONE은 소리를 멈추는 것에 대한 걱정이 없기 때문에 경고 신호로 사
용되어져야 한다.
KIOCSOUND는 splay 예제 프로그램에서 보여지는 것처럼 멜로디를 연주하는
데 사용될 수 있다. 소리를 멈추기위해 톤(tone) 값 0를 사용해야만 한다.
/*---------------------------------------*/
/* A sample program to play C major */
/* through a PC speaker */
/*---------------------------------------*/
/* This won't work if standard output is */
/* re-directed to a non-tty device, or */
/* PC speaker wave output is active */
/*---------------------------------------*/
/* M.G. 27-Nov-99 */
/*---------------------------------------*/
#include
#include
#include
int main(void)
{
int freq[] = { /* C D E F G A B C */
523, 587, 659, 698, 784, 880, 988,
1046 };
int i;
예전에 도스에서 PC 스피커로 사운드 내는 것과 동일한 방식을 사용합니
다.
스마츠콜에는 좀 더 복잡한 매커니즘으로 동작합니다.
C나 D#과 같은 것을 주파수로 변환해서 플레이 할 수 있습니다.
예전 문서들도 참고해보시면 좋을 것 같습니다.
참고로... 사운드 카드가 없는 사람들을 위해 PC Speaker로 사운드를 플레
이 하는 방법이 있습니다.
pdsp라는 것인데... 아래의 내용을 참고하세요.
PC-speaker driver
originally by Michael Beck.
Allows to send a wave form to a PC-speaker, and control volume.
Sound driver for linux 2.0. Stand alone. No longer maintained.
ftp//metalab.unc.edu/pub/Linux/kernel/sound/pcsndrv-1.0.tgz
A new effort - pc speaker support as a part of Linux sound driver.
The code is based on Michael Beck's driver.
David Woodhouse - patch for 2.2.8
ftp//ftp.uk.linux.org/pub/people/dwmw2/pcsp/
Re: 비프음 주파수 & 길이 조절방법...
비프음의 주파수와 길이는 조정할 수 있습니다.
하지만 저도 볼륨을 조절하는 방법은 모르겠습니다.
혹시 알아내시면 저에게도 정보를 부탁드립니다.
아래는 리눅스용 스마츠콜을 만들면서 참조한 문서입니다.
스마츠콜을 실행하셔서 환경설정에 sound에 PC Speaker를 보시면 아래의
것을 이용해서 만든 멜로디(캐논과 기타..)가 있습니다.
한번 들어 보시지요...^^
주파수는 아래의 문서를 이용해서 조절하시면 됩니다.
그리고 길이는 sleep으로 조정하시면 되고요.
/dev/console을 오픈하시면 됩니다.
(아래 문서에서 빠진 내용이라 처음에 삽질 했습니다.)
아래와 같은 방법을 사용하지 않으시고 따로 Assembler(outb)를 이용하시
는 방법도 있습니다.
참고문헌 kldp 프로그래밍...(리눅스 프로그래머를 위한 가이드 중에서)
http//users.unitel.co.kr/~sangeun5/linux/lpg_7_1.html
==========================================================
7.1 내부 스피커 프로그래밍 (Programming the internal speaker)
믿거나 말거나, PC 스피커는 리눅스 콘솔(Console)의 부분이고 그러므로
문자장치 (character device)이다. 따라서, ioctl() 요청들(requests)은
그것을 조종하기 위해 존재한다. 내부 스피커에 대해 다음 2개의 요청
(request)이 있다.
KDMKTONE
커널 타이머를 사용하여 지정된 시간에 소리(beep)를 발생시킨다.
예제 ioctl (fd, KDMKTONE, (long) argument)
KIOCSOUND
현재 울리고 있는 소리(beep)를 멈추거나 끝없이 소리(beep)를 발생시킨
다.
예제 ioctl (fd, KIOCSOUND, (int) tone)
아규먼트(argument)는 low word에 있는 톤(tone)과 high word에 있는 지속
성(duration)의 값으로 이루어진다. 톤(tone) 값은 주파수가 아니다. PC
메인보드 타이머 (mainboard timer) 8254는 1.19 MHz의 clock을 사용하고
이는 1190000/주파수 를 의미한다. 지속성(duration)은 타이머의 똑딱임으
로 측정된다. 두개의 ioctl 호출은 즉각적으로 반환됨으로 프로그램을 차
단하지 않고 소리(beep)를 제공하는 방법이 될 수 있다.
KDMKTONE은 소리를 멈추는 것에 대한 걱정이 없기 때문에 경고 신호로 사
용되어져야 한다.
KIOCSOUND는 splay 예제 프로그램에서 보여지는 것처럼 멜로디를 연주하는
데 사용될 수 있다. 소리를 멈추기위해 톤(tone) 값 0를 사용해야만 한다.
Re: 소스와 참고사항
다음과 같은 곳에 소스와 참고할 만한 내용이 있군요.
http//www.luv.asn.au/overheads/linux_sound/pcspkr.html
/*---------------------------------------*/
/* A sample program to play C major */
/* through a PC speaker */
/*---------------------------------------*/
/* This won't work if standard output is */
/* re-directed to a non-tty device, or */
/* PC speaker wave output is active */
/*---------------------------------------*/
/* M.G. 27-Nov-99 */
/*---------------------------------------*/
#include
#include
#include
int main(void)
{
int freq[] = { /* C D E F G A B C */
523, 587, 659, 698, 784, 880, 988,
1046 };
int i;
for (i=0; i<8; i++)
{
ioctl(STDOUT_FILENO, KIOCSOUND, 1193180/freq[i]);
usleep(500000);
}
ioctl(STDOUT_FILENO, KIOCSOUND, 0); /*Stop silly sound*/
return 0;
}
다음은 캐논의 주파수 입니다.
200 150 175 200 250 225
200 150 175 200 250 225
200 150 175 200 250 225
150 250 175 225 200 225 175 250 150
200 210 200 210
200 150 175 200 250 225
200 150 175 200 250 225
200 150 175 200 250 225
300 200 250 300 200 250 225 275 300
200 210 200 210
150 250 175 225 200 225 175 250 150
200 210 245
220 230 275
240 250 300
260 270 320
280 290 335
300 310 345
320 330 350
340 350
340 350
340 350
320 290 260 230 200 170 140
145 135 150 130 155 125 160 120
170 130 180 140 190 150 200 160
200 150 175 200 250 225
200 150 175 200 250 225
200 150 175 200 250 225
200 210 200 210 200 210 200 210
예전에 도스에서 PC 스피커로 사운드 내는 것과 동일한 방식을 사용합니
다.
스마츠콜에는 좀 더 복잡한 매커니즘으로 동작합니다.
C나 D#과 같은 것을 주파수로 변환해서 플레이 할 수 있습니다.
예전 문서들도 참고해보시면 좋을 것 같습니다.
참고로... 사운드 카드가 없는 사람들을 위해 PC Speaker로 사운드를 플레
이 하는 방법이 있습니다.
pdsp라는 것인데... 아래의 내용을 참고하세요.
PC-speaker driver
originally by Michael Beck.
Allows to send a wave form to a PC-speaker, and control volume.
Sound driver for linux 2.0. Stand alone. No longer maintained.
ftp//metalab.unc.edu/pub/Linux/kernel/sound/pcsndrv-1.0.tgz
A new effort - pc speaker support as a part of Linux sound driver.
The code is based on Michael Beck's driver.
David Woodhouse - patch for 2.2.8
ftp//ftp.uk.linux.org/pub/people/dwmw2/pcsp/
댓글 달기