Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2011, 00:00   #1
IceBreaker
Пользователь
 
Аватар для IceBreaker
 
Регистрация: 03.02.2010
Сообщений: 20
По умолчанию pc speaker

Привет народ! Хочу поразвлечься, заставить спикер играть в лесу родилась елочка, не пойму с чего начать. Хотя нет, понимаю, погуглить, поэтому не умничать. Нарыл кусок кода для turbo c 3.0


Код:
#include <dos.h>
#include <conio.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

void playsound(int note, int duration);

int main()
{
 int song[][2]={
	392,250,392,375,330,125,330,250,
	392,250,392,375,294,125,294,250,
	330,250,349,250,392,250,440,250,
	494,250,392,750,392,250,392,375,
	330,125,330,250,392,250,392,375,
	294,125,294,250,587,250,554,250,
	587,250,659,250,404,250,587,750,
	392,250,659,375,659,125,587,250,
	523,250,523,375,494,125,494,250,
	523,250,587,250,494,250,440,250,
	392,250,523,750,523,250,523,375,
	440,125,440,250,523,250,440,250,
	392,125,392,250,392,250,440,250,
	523,250,392,250,587,250,523,750,
	0,0
	};
	int x=0;
	while(song[x++][0])
	                   playsound(song[x][0],song[x][1]);
	                   wait(100);
return 0;
}

 void playsound(int note, int duration)
 {
	do{
	sound(note);
	delay(duration);
	nosound();
	}
	while(!kbhit());
 }
Попытался запустить на dev-c++ не пошло. в чем может быть проблема? это первый вопрос.
Второе, что хочу спросить, основное:
как все работает? мой вариант: есть в компе устройство, у него свой порт приема инфы, своя таблица звуков. как мне заставить комп посылать туда сигналы, какой у них формат, есть ли библиотека специально для устройства?
Shit happens
IceBreaker вне форума Ответить с цитированием
Старый 11.01.2011, 00:16   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

какая там ещё таблица звуков... Юзай Beep() и будет тебе щастье.

А вобще, с этим спикером смешная история вышла.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 11.01.2011, 01:00   #3
IceBreaker
Пользователь
 
Аватар для IceBreaker
 
Регистрация: 03.02.2010
Сообщений: 20
По умолчанию

спасибо. а как посмотреть реализацию функции?
Shit happens
IceBreaker вне форума Ответить с цитированием
Старый 11.01.2011, 01:11   #4
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

а если у меня нет динамика в материнке, можно по другому услышать? через колонки
NiCola999 вне форума Ответить с цитированием
Старый 11.01.2011, 01:25   #5
IceBreaker
Пользователь
 
Аватар для IceBreaker
 
Регистрация: 03.02.2010
Сообщений: 20
По умолчанию

если буквально: если динамика нет, что ты хочешь услышать!?
если предположить, что ты имеешь ввиду, есть ли замена спикеру:
есть простой способ проверить, зажми кучу кнопок на клаве - бипнет, значит можно. Имею ввиду, что есть имитация бипера через звуковуху.
Shit happens
IceBreaker вне форума Ответить с цитированием
Старый 11.01.2011, 01:55   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
Сообщение от IceBreaker Посмотреть сообщение
а как посмотреть реализацию функции?
ну, реализация там простая: сначала программируешь таймер на заданную частоту:

Код:
OUT 43h, B6h
OUT 42h, 54
OUT 42h, 124
(124 * 256 + 54 = 31798, т.е. частота будет 1193180/31798 = 37.5 герц).

А потом включаешь

Код:
IN 61h, AX
OR AX, 3
OUT 61h, AX
или выключаешь

Код:
IN 61h, AX
AND AX, 0FCh
OUT 61h, AX
спикер. Естественно, под виндой тебя к портам не пустят, так что приходится юзать Beep(), которая включает спикер на заданное время на заданной часте. По ссылке там есть таблица частот для нот, так что ёлку можно сыграть.

Под XP 64/Vista 64 Beep() вобще не работает никак, под 32 битными вроде пищит. Под семеркой любой оно пищит на дефолтовое устройство (звуковая карта, USB наушники и т.д.).

Цитата:
а если у меня нет динамика в материнке, можно по другому услышать? через колонки
Да. Поставь семерку ) Помню, под 95 винду был какой-то драйверок, а что там под 2К или XP, не знаю, гуглить надо.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 11.01.2011, 03:02   #7
Flyasd1
Пользователь
 
Регистрация: 06.01.2011
Сообщений: 11
По умолчанию

Цитата:
Под XP 64/Vista 64 Beep() вобще не работает никак
Все работает! Просто собирать надо 64битную версию программы.
Flyasd1 вне форума Ответить с цитированием
Старый 11.01.2011, 03:42   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Возможно, хотя у меня всё-равно не работает, в любой версии. Другой вопрос, есть ли у меня тут спикер.. завтра проверю )

Цитата:
Eventually because of the lack of hardware to communicate with, support for Beep was dropped in Windows Vista and Windows XP 64-Bit Edition.
я исходил из этого.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 27.01.2011, 18:44   #9
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

кстати, проверил, спикер есть, под 32 хп пищит. под 64 хп молчит, хоть в 32 компилируй, хоть в 128
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц