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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2008, 18:36   #1
KapeLLaN
Пользователь
 
Регистрация: 13.02.2008
Сообщений: 12
По умолчанию Вывод звука на колонки

Мне необходимо вывести звуковой сигнал опридиленной частоты и длительности на колонки или наушники(вобщем на электро-акустический преобразователь).Есть функция bool:Beep(),но она выводит описаный выше сигнал на динамик компютера.Как можно используя эту функцию вывести сигнал на колонки?Или подскажите как решить даную проблему иным путем.
KapeLLaN вне форума Ответить с цитированием
Старый 17.02.2008, 19:24   #2
merax
Форумчанин
 
Регистрация: 27.12.2006
Сообщений: 955
По умолчанию

Use Google


Код:
#include <windows.h>
#include <mmsystem.h>

#include <stdio.h>
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "user32.lib")

const int nRate = 44100;
const int nBits = 16;
const int nBytesPerSample = nBits / 8;

const int nSeconds = 1;

const int nSamples = nRate * nSeconds;
const int nBytes   = nSamples * nBytesPerSample;

typedef signed short SWORD;

LPCSTR GetMMSysError(MMRESULT mmResult){
    const int nBufferSize = 512;
    static CHAR acError[nBufferSize];

  waveOutGetErrorText(mmResult, acError, nBufferSize);
  CharToOem(acError, acError);
  return acError;
}

LONG bDone = FALSE;

void CALLBACK waveOutProc(
  HWAVEOUT hwo, UINT uMsg,         
  DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
{
  if(uMsg == WOM_DONE || uMsg == WOM_CLOSE) 
      InterlockedIncrement(&bDone);
}

int main(void){
  static SWORD aswBuffer[nSamples]; 

  // генерация звука: прямоугольные импульсы частотой nRate / 200; 
  // при nRate = 44100 получаем 220,5 Гц 
  // (частотный анализ записи показал 220,46 Гц) 
  for (UINT i = 0; i < nSamples; i++) 
  {
    if((i/100)%2)
      aswBuffer[i] =  32767;
    else
      aswBuffer[i] = -32767;
  }

  
  WAVEFORMATEX wfx; // для получения описателя звукового устройства:
  wfx.wFormatTag = WAVE_FORMAT_PCM;   // wav-формат
  wfx.nChannels = 1; // моно - звук
  wfx.nSamplesPerSec = nRate; // 44100 Гц
  wfx.nAvgBytesPerSec = nBytesPerSample * nRate; // байт в секунду
  wfx.nBlockAlign = nBytesPerSample; // 2 байта на сэмпл-столбик
  wfx.wBitsPerSample = nBits; // 16-битный сэмпл-столбик
  wfx.cbSize = 0; // For only WAVE_FORMAT_PCM formats, this member is ignored

  HWAVEOUT hWO; // handle identifying the open waveform-audio output device
  MMRESULT mmResult = waveOutOpen(&hWO, WAVE_MAPPER, &wfx, (DWORD)waveOutProc, 0, CALLBACK_FUNCTION);

  if(mmResult == MMSYSERR_NOERROR)
  {
      printf("waveOutOpen() СРАБОТАЛА УСПЕШНО! hWO = 0%08X\n", hWO);
  }
  else
    printf("waveOutOpen() НЕ СРАБОТАЛА! %s\n", GetMMSysError(mmResult));

  WAVEHDR whdr; 
  whdr.lpData = (LPSTR)aswBuffer; 
  whdr.dwBufferLength = nBytes; // размер буфера в байтах.
  whdr.dwFlags = 0; // Буфер подготовлен (зафиксирован в памяти)
  whdr.dwLoops = 0; // В обычном режиме, без циклов, поле должно быть нулевым.

  mmResult = waveOutPrepareHeader(hWO, &whdr, sizeof(whdr));
  if(mmResult == MMSYSERR_NOERROR)
  {
      printf("waveOutPrepareHeader() РАБОТАЕТ !\n");
  }
  else
    printf("waveOutPrepareHeader() НЕ РАБОТАЕТ ! %s\n", GetMMSysError(mmResult));

  waveOutSetVolume(hWO, 0xFFFF);

  mmResult = waveOutWrite(hWO, &whdr, sizeof(whdr));
  if(mmResult == MMSYSERR_NOERROR)
  {
      printf("waveOutWrite() СРАБОТАЛА УСПЕШНО!\n");
  }
  else
    printf("waveOutWrite() НЕ СРАБОТАЛА! %s\n", GetMMSysError(mmResult));

  printf("Значение waveOutGetNumDevs() равно %d", waveOutGetNumDevs());

 for(;;){
      if(bDone) break;
  }

  waveOutClose(hWO);

  return 0;
}
....


вот тут или тут

Последний раз редактировалось merax; 17.02.2008 в 19:27.
merax вне форума Ответить с цитированием
Старый 18.02.2008, 11:25   #3
KapeLLaN
Пользователь
 
Регистрация: 13.02.2008
Сообщений: 12
По умолчанию

merax БОЛЬШОЕ спасибо,вы мне указали свет в конце тунеля(свет скорее всего от монитора (-: ).
KapeLLaN вне форума Ответить с цитированием
Старый 18.02.2008, 13:03   #4
KapeLLaN
Пользователь
 
Регистрация: 13.02.2008
Сообщений: 12
По умолчанию

да и кстати,за проверку бдительности спасибо
(
#include <iostream>;
using namespace std;
)
(((-:
KapeLLaN вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DBGrid ширина колонки Pinya БД в Delphi 7 07.08.2008 09:22
Сравнить колонки Romuald Microsoft Office Excel 11 22.01.2008 09:28
Вывод звука. C++ Oznob Помощь студентам 0 04.12.2007 01:43
Колонки в richedit или memo 2face Компоненты Delphi 1 15.06.2007 15:08