Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа со звуком в Visual C++, вывод звука на sound blaster 
:(
    Опции темы
ud_sasha
Дата 24.7.2004, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 24.7.2004

Репутация: нет
Всего: нет



Когда-то в Borland C++5 была (да и сейчас есть) функция sound(), которая выводила звук определенной частоты на встроенный динамик. Хотелось бы узнать как такое реализовать на Visual C++ 6.0, только звук выводить на звуковую карту. Итак, требуется, к примеру, заставить издавать звуковую карту звук частотой 900 Гц 1 секунду. Спасибо.
PM MAIL   Вверх
mr.DUDA
Дата 25.7.2004, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Есть такая функция, Beep называется. Но, к сожалению, в Win98/Me она не поддерживает аргументы dwFreq и dwDuration (вместо этого система издаёт "стандартный" звук).

Но можно сделать то же самое, используя PlaySound с параметрами SND_ASYNC | SND_LOOP | SND_MEMORY. Для остановки звука можно вызвать PlaySound с NULL в аргументе pszSound. Чтобы сформировать звук требуемой частоты прямо в памяти, достаточно выполнить ряд не слишком сложных действий, а именно:
- сформировать WAV-header
- заполнить дорожку сэмплами по периоду синусоиды
- длину дорожки подбирать в зависимости от требуемой частоты

Так как звук будет повторяться (SND_LOOP), то одного периода синусоиды будет достаточно. Вот пример, в котором реализована уже готовая функция SuperBeep, возвращающая управление после того, как звук отзвучит заданное количество миллисекунд (dwMilliSeconds). Кстати, можно и не ожидать завершения звучания -- для этого нужно запустить SuperBeep в отдельном потоке.

Исходный текст ф-ции SuperBeep с примером использования:
Цитата
#include "stdafx.h"
#include "windows.h"
#include "math.h"

// подключаем LIB-файл для ф-ции PlaySound
#pragma comment(lib, "winmm.lib")

// описание заголовка файла WAV
struct WAVHEADER
{
   
char    sigRIFF[4];     // должно быть равно "RIFF"
   
DWORD   sizeRIFFch;     // размер чанка RIFF
   
char    sigWAVE[4];     // должно быть равно "WAVE"
   
char    sigFMT[4];      // должно быть равно "fmt "
   
DWORD   sizeFMTch;      // размер чанка FMT
   
WORD    wFormatTag;     // категория формата, для PCM = 1
   
WORD    wChannels;      // кол-во каналов: 1-моно 2-стерео
   
DWORD   dwSamplesPerSec;// кол-во сэмплов в сек.
   
DWORD   dwAvgBytesPerSec;// среднее число байт в сек
   
WORD    wBlockAlign;    // выравнивание данных в дата-чанке
   
WORD    wBitPerSample// бит в сэмпле
   
char    sigDATA[4];     // должно быть равно "data"
   
DWORD   sizeDATAch;     // размер data-чанка
};


void SuperBeep(DWORD dwFrequency, DWORD dwMilliSeconds)
{
   
// частота дискретизации = 44100 Гц
    // кол-во бит на сэмпл = 8
    // если требуемая частота > 44100 или равна нулю, то выходим
   
if(!dwFrequency || dwFrequency>44100)
       
return;

   
// длина дорожки в байтах
   
DWORD numSamples = 44100 / dwFrequency;
   
   
// выделяем память под дорожку
   
DWORD size = sizeof(WAVHEADER) + numSamples;
   
void *buff = new char[size ];
   
   
// заполняем WAV-header
   
WAVHEADER *head = (WAVHEADER*)buff;
   
strcpy(head->sigRIFF, "RIFF");
   
strcpy(head->sigWAVE, "WAVE");
   
head->sizeRIFFch = size - 8;
   
strcpy(head->sigFMT, "fmt ");
   
head->sizeFMTch = 16;
   
head->wFormatTag = 1;
   
head->wChannels = 1; // моно
   
head->dwSamplesPerSec = 44100;
   
head->dwAvgBytesPerSec = 44100;
   
head->wBlockAlign = 1;
   
head->wBitPerSample = 8;
   
strcpy(head->sigDATA, "data");
   
head->sizeDATAch = size;

   
// заполняем дорожку периодом синуса
   
BYTE *samples = (BYTE*)(head+1);
   
for(DWORD i=0; i<size; i++)
       
samples[i] = BYTE(255*sin(6.28*double(i)/double(size)));

   
// проигрываем звук
   
PlaySound((const char*)buff, 0, SND_ASYNC|SND_LOOP|SND_MEMORY);

   
// ждём заданное количество миллисекунд
   
Sleep(dwMilliSeconds);

   
// останавливаем звук
   
PlaySound(0, 0, SND_ASYNC);
}


int main(int argc, char* argv[])
{
   
SuperBeep(900, 1000);
   
return 0;
}



--------------------
user posted image
PM MAIL WWW   Вверх
ud_sasha
Дата 25.7.2004, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 24.7.2004

Репутация: нет
Всего: нет



Спасибо, то что надо!!!
только
Цитата
for(DWORD i=0; i<size; i++)

следует читать как:
Код
for(DWORD i=0; i<numSamples; i++)


иначе за пределы буфера начинаем писать.

Это сообщение отредактировал(а) ud_sasha - 25.7.2004, 16:17
PM MAIL   Вверх
Rutti
Дата 26.7.2004, 01:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 225
Регистрация: 25.7.2004

Репутация: нет
Всего: нет



А как проще средствами VC++ воспроизвести MP3-файл?
PM MAIL   Вверх
gepard
Дата 26.7.2004, 04:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2477
Регистрация: 29.2.2004

Репутация: 2
Всего: 40



Это надо тебе DirectX или OpenAL разбирать
А вообще, вот как просто можно воспроизвести звук *.wav:
Взято с одного из форумов:
Цитата

Написал отличную игру, осталось добавить звуки. Но почему-то не получается. Я пишу так:

#include <windows.h>
#include <mmsystem.h>
#include <windowsx.h>
...
sndPlaySound("C:\\WINME\\MEDIA\\TADA.wav", NULL);

Возникает ошибка:
error LNK2001: unresolved external symbol __imp__sndPlaySoundA@8

Что я делаю не так?
И есть ли в MFC какие-нибудь классы для работы со звуком?


schmidt
Писатель

Из: Frankfurt
Сообщения: 197
  Звуки в VC++

Послано: 05-07-2002 23:29    Цитата      Ответить



А не забыли Winmm.lib подключить?
Лучше использовать функцию PlaySound, на мой взгляд.

~~~~~~~~~~~~



Плюс вот это:
USES mmsystem;

sndPlaySound('C:\TEST.WAV',SND_ASYNC); // PLAY
sndPlaySound('C:\TETS.WAV',SND_ASYNC+SND_LOOP); // Loop Mode (зацикливание)
sndPlaySound(Nil,SND_ASYNC); //STOP

Думаю разберёшься.


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
chipset
Дата 26.7.2004, 04:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4067
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 164



Человеку видимо необходим формат *.MP3.. Наверное надо копать в сторону DirectMusic.


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Rutti
Дата 26.7.2004, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 225
Регистрация: 25.7.2004

Репутация: нет
Всего: нет



chipset
Цитата
надо копать в сторону DirectMusic.


Так капни же!
PM MAIL   Вверх
gepard
Дата 27.7.2004, 05:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2477
Регистрация: 29.2.2004

Репутация: 2
Всего: 40



biggrin.gif
Ты знаешь, какя лопата нужна?
Столько времени нужно.
Лучше учите OpenAL. хотя лопата и время от этого не уменьшились biggrin.gif


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
chipset
Дата 27.7.2004, 07:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4067
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 164



Это вечный вопрос..
Хотя ДиректИкс имхо перспективнее..


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
gepard
Дата 27.7.2004, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2477
Регистрация: 29.2.2004

Репутация: 2
Всего: 40



Его же вроде микрософт вообще не будет больше делать qstn.gif


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
maxim1000
Дата 27.7.2004, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата
А как проще средствами VC++ воспроизвести MP3-файл?

ShellExecute... (описание можно найти в MSDN)

Это сообщение отредактировал(а) maxim1000 - 27.7.2004, 17:25


--------------------
qqq
PM WWW   Вверх
chipset
Дата 28.7.2004, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4067
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 164



[quote]Его же вроде микрософт вообще не будет больше делать [quote]
ДА? qstn.gif
Я слышал что наоборот Ogl загибается biggrin.gif
Ох, флеймим товарищи... exclamation.gif


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
DeadProger
Дата 8.1.2005, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 30.12.2004
Где: The Earth

Репутация: нет
Всего: нет



Где можно найти понятное объяснение основ DirectMusic?
PM MAIL   Вверх
chipset
Дата 8.1.2005, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4067
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 164



DeadProger
MSDN.
Модератор: Пожалуйста, один топик - один вопрос.


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
qqqq1961
Дата 10.1.2015, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.8.2013

Репутация: нет
Всего: нет



Цитата(mr.DUDA @ 25.7.2004,  11:27)
используя PlaySound ...
Код

#include "stdafx.h"
#include "windows.h"
#include "math.h"
#pragma comment(lib, "winmm.lib")
struct WAVHEADER
{
    char    sigRIFF[4];
    DWORD   sizeRIFFch;
    char    sigWAVE[4];
    char    sigFMT[4]; 
    DWORD   sizeFMTch; 
    WORD    wFormatTag;
    WORD    wChannels; 
    DWORD   dwSamplesPerSec;.
    DWORD   dwAvgBytesPerSec;
    WORD    wBlockAlign;    
    WORD    wBitPerSample;  
    char    sigDATA[4];     
    DWORD   sizeDATAch;     
};


void SuperBeep(DWORD dwFrequency, DWORD dwMilliSeconds)
{
    if(!dwFrequency || dwFrequency>44100)  return;
    DWORD numSamples = 44100 / dwFrequency;
    
    DWORD size = sizeof(WAVHEADER) + numSamples;
    void *buff = new char[size ];
    
    WAVHEADER *head = (WAVHEADER*)buff;
    strcpy(head->sigRIFF, "RIFF");
    strcpy(head->sigWAVE, "WAVE");
    head->sizeRIFFch = size - 8; 
    strcpy(head->sigFMT, "fmt ");
    head->sizeFMTch = 16;
    head->wFormatTag = 1;
    head->wChannels = 1; // моно
    head->dwSamplesPerSec = 44100;
    head->dwAvgBytesPerSec = 44100;
    head->wBlockAlign = 1;
    head->wBitPerSample = 8;
    strcpy(head->sigDATA, "data");
    head->sizeDATAch = size;

    BYTE *samples = (BYTE*)(head+1);

 !!!  for(DWORD i=0; i<size; i++) samples[i] = 0;
!!!   for(DWORD i=0; i<size; i++) samples[i] = BYTE(255*sin(6.28*double(i)/double(size)));
    

    PlaySound((const char*)buff, 0, SND_ASYNC|SND_LOOP|SND_MEMORY);
    Sleep(dwMilliSeconds);
    PlaySound(0, 0, SND_ASYNC);
!!!    
}


int main(int argc, char* argv[])
{
  SuperBeep(900, 1000);
}


Кроме предложенного ud_sasha:
Код

for(DWORD i=0; i<numSamples; i++)

Предлагаю исправить еще один выход за пределы буфера:

Код

for(DWORD i=0; i<numSamples; i++) samples[i] = BYTE(255*sin(6.28*double(i)/double(numSamples)));


И нужно деструктор в конце, особенно если нужно повторно функцию вызывать:
Код

  // останавливаем звук
  PlaySound(0, 0, SND_ASYNC);
  delete [] buff;


Это сообщение отредактировал(а) qqqq1961 - 12.1.2015, 00:10
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1711 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.