Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Звук под Windows, Работа со звуком 
:(
    Опции темы
borisbn
Дата 11.4.2011, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(krasgames @  11.4.2011,  04:08 Найти цитируемый пост)
include <math.h>

в начале пропустил знак #

Цитата(krasgames @  11.4.2011,  04:08 Найти цитируемый пост)
 const double Pi = acos( -1 );

замени на 
Код

const double Pi = acos( -1.0 );


Цитата(krasgames @  11.4.2011,  04:08 Найти цитируемый пост)
int outSampleRate = 22050;

замени на 
Код

const int outSampleRate = 22050;




--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
leniviy
Дата 12.4.2011, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Что-то у вас ни про MMSystem, ни про DirectX. Я тут кое-что раскопал

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  wnoise.zip 43,39 Kb
PM MAIL   Вверх
krasgames
Дата 14.4.2011, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старый мастер
*


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

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



Цитата
// consule.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <math.h>
int main()
{
   const double Pi = acos( -1.0 );
   const int outSampleRate = 22050; // выходная частота дискретизации. задаётся при воспроизведении
   int toneFreq = 1000; // частота генерируемого сигнала
   short amplitude = 20000; // амплитуда выходного сигнала. от 0 до 32767
   short buffer[ outSampleRate ];
   for ( int i = 0; i < outSampleRate; i++ )
   {
       buffer[ i ] = (short)( amplitude * sin( toneFreq / (double)outSampleRate * i * 2 * Pi ) );
   } 
}

Ну теперь ошибок нет. Звук не выдает. 
PM MAIL   Вверх
borisbn
Дата 14.4.2011, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



krasgames, это всего лишь генерация данных, которые, если озвучить (подать на звуковую), даст тон. Теперь нужно этот буфер (buffer) озвучить. как ? я уже говорил. 
и не раз...


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
krasgames
Дата 16.4.2011, 04:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старый мастер
*


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

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



Не понимаю пока. В buffer записывается массив? И как его проиграть с помощью playsound? Там же надо уже файл открыть.
PM MAIL   Вверх
borisbn
Дата 16.4.2011, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



PlaySound проигрывает файл, а я давал ссылку на функции проигрывания буфера.
Вот предпоследняя ссылка оттуда
msdn.microsoft.com/en-us/library/ms708482(v=vs.85).aspx


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
krasgames
Дата 17.4.2011, 05:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старый мастер
*


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

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



Если этот код просто добавить после буфера, то выдает ошибки. Я пока не понимаю, что там делается
PM MAIL   Вверх
borisbn
Дата 17.4.2011, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(krasgames @  17.4.2011,  05:08 Найти цитируемый пост)
выдает ошибки

какие именно - религия не позволяет озвучить ?

Цитата(krasgames @  17.4.2011,  05:08 Найти цитируемый пост)
Я пока не понимаю, что там делается

там валом комментариев
Цитата
// Open a waveform device for output using window callback.

Цитата
// Allocate and lock memory for the waveform data.

Цитата
// Read the waveform data subchunk.

Цитата
// Allocate and lock memory for the header.

Цитата
// After allocation, set up and prepare header.

Цитата
// Now the data block can be sent to the output device. The 
// waveOutWrite function returns immediately and waveform 
// data is sent to the output device in the background.
 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
krasgames
Дата 17.4.2011, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старый мастер
*


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

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



Пишет, что переменные не определены. cpp такой: 
Код

#include "stdafx.h"
#include <math.h>
#include <windows.h>
int main()
{
   const double Pi = acos( -1.0 );
   const int outSampleRate = 22050; // выходная частота дискретизации. задаётся при воспроизведении
   int toneFreq = 1000; // частота генерируемого сигнала
   short amplitude = 20000; // амплитуда выходного сигнала. от 0 до 32767
   short buffer[ outSampleRate ];
   for ( int i = 0; i < outSampleRate; i++ )
   {
       buffer[ i ] = (short)( amplitude * sin( toneFreq / (double)outSampleRate * i * 2 * Pi ) );
   } 

HANDLE hData  = NULL;  // handle of waveform data memory 
HPSTR  lpData = NULL;  // pointer to waveform data memory 
 
void WriteWaveData(void) 
{ 
    HWAVEOUT    hWaveOut; 
    HGLOBAL     hWaveHdr; 
    LPWAVEHDR   lpWaveHdr; 
    HMMIO       hmmio; 
    UINT        wResult; 
    HANDLE      hFormat; 
    WAVEFORMAT  *pFormat; 
    DWORD       dwDataSize; 

    // Open a waveform device for output using window callback. 

    if (waveOutOpen((LPHWAVEOUT)&hWaveOut, WAVE_MAPPER, 
                    (LPWAVEFORMAT)pFormat, 
                    (LONG)hwndApp, 0L, CALLBACK_WINDOW)) 
    { 
        MessageBox(hwndApp, 
                   "Failed to open waveform output device.", 
                   NULL, MB_OK | MB_ICONEXCLAMATION); 
        LocalUnlock(hFormat); 
        LocalFree(hFormat); 
        mmioClose(hmmio, 0); 
        return; 
    } 
 
    // Allocate and lock memory for the waveform data. 
 
    hData = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, dwDataSize ); 
    if (!hData) 
    { 
        MessageBox(hwndApp, "Out of memory.", 
                   NULL, MB_OK | MB_ICONEXCLAMATION); 
        mmioClose(hmmio, 0); 
        return; 
    } 
    if ((lpData = GlobalLock(hData)) == NULL) 
    { 
        MessageBox(hwndApp, "Failed to lock memory for data chunk.", 
                   NULL, MB_OK | MB_ICONEXCLAMATION); 
        GlobalFree(hData); 
        mmioClose(hmmio, 0); 
        return; 
    } 
 
    // Read the waveform data subchunk. 
 
    if(mmioRead(hmmio, (HPSTR) lpData, dwDataSize) != (LRESULT)dwDataSize) 
    { 
        MessageBox(hwndApp, "Failed to read data chunk.", 
                   NULL, MB_OK | MB_ICONEXCLAMATION); 
        GlobalUnlock(hData); 
        GlobalFree(hData); 
        mmioClose(hmmio, 0); 
        return; 
    } 
 
    // Allocate and lock memory for the header. 

    hWaveHdr = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, 
        (DWORD) sizeof(WAVEHDR)); 
    if (hWaveHdr == NULL) 
    { 
        GlobalUnlock(hData); 
        GlobalFree(hData); 
        MessageBox(hwndApp, "Not enough memory for header.", 
            NULL, MB_OK | MB_ICONEXCLAMATION); 
        return; 
    } 
 
    lpWaveHdr = (LPWAVEHDR) GlobalLock(hWaveHdr); 
    if (lpWaveHdr == NULL) 
    { 
        GlobalUnlock(hData); 
        GlobalFree(hData); 
        MessageBox(hwndApp, 
            "Failed to lock memory for header.", 
            NULL, MB_OK | MB_ICONEXCLAMATION); 
        return; 
    } 
 
    // After allocation, set up and prepare header. 
 
    lpWaveHdr->lpData = lpData; 
    lpWaveHdr->dwBufferLength = dwDataSize; 
    lpWaveHdr->dwFlags = 0L; 
    lpWaveHdr->dwLoops = 0L; 
    waveOutPrepareHeader(hWaveOut, lpWaveHdr, sizeof(WAVEHDR)); 
 
    // Now the data block can be sent to the output device. The 
    // waveOutWrite function returns immediately and waveform 
    // data is sent to the output device in the background. 
 
    wResult = waveOutWrite(hWaveOut, lpWaveHdr, sizeof(WAVEHDR)); 
    if (wResult != 0) 
    { 
        waveOutUnprepareHeader(hWaveOut, lpWaveHdr, 
                               sizeof(WAVEHDR)); 
        GlobalUnlock( hData); 
        GlobalFree(hData); 
        MessageBox(hwndApp, "Failed to write block to device", 
                   NULL, MB_OK | MB_ICONEXCLAMATION); 
        return; 
    } 
} 
}

Может что-то не включил?
PM MAIL   Вверх
borisbn
Дата 17.4.2011, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(krasgames @  17.4.2011,  11:33 Найти цитируемый пост)
Пишет, что переменные не определены. cpp такой: 

предлагаешь взять твой код, создать  проект, добавить в него твой код, и посмотреть, на что именно ругается компилятор... на какой строке... какие именно переменные "не определены" ?
за пивом сходить ? smile

первое, что видно, так это то, что ты определил функцию WriteWaveData внутри функции main. Этого нельзя делать в Си++.
Ты знаешь, мне кажется с твоими знаниями Си++ тебе ещё рановато использовать winAPI. Не обижайся, я не пнуть тебя или посмеяться хочу, а помочь. Посмотри лучше другие языки (C#, Delphi, Python). Если же хочешь именно Си++, то начни с учебника, с учебных задач, а не с такой (не сказать, что сложной, но и вовсе не простой для новичка) задачи.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
krasgames
Дата 17.4.2011, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старый мастер
*


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

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



Заново. Мои действия: 
1. буффер создал и включил его в функцию main, в итоге ошибок не выдало, это делал сугубо по инструкциям в посте:
Код

 const double Pi = acos( -1.0 );
   const int outSampleRate = 22050; // выходная частота дискретизации. задаётся при воспроизведении
   int toneFreq = 1000; // частота генерируемого сигнала
   short amplitude = 20000; // амплитуда выходного сигнала. от 0 до 32767
   short buffer[ outSampleRate ];
   for ( int i = 0; i < outSampleRate; i++ )
   {
       buffer[ i ] = (short)( amplitude * sin( toneFreq / (double)outSampleRate * i * 2 * Pi ) );
   } 

2. Вставил код с ссылки после функции main "для воспроизведения буфера". Ничего не менял, это код с сайта!
Сейчас по прежнему выдает ошибку, но пишет: "hwndApp undeclared", начиная с 36 строчки и кончая 121. И еще невозможно преобразовать кое-что на строке 57.
Просто я не сталкивался с такого рода задачами:( Вообще мы по специальности С++ изучали, но с уклоном в нужную сторону. Можно бы и в книге поискать, но у меня специальность вообще не в эту сторону, нельзя время терять, в своей области читать много:( Вот и спрашиваю у профессионалов, лень подсказать что ли?smile

Это сообщение отредактировал(а) krasgames - 17.4.2011, 14:07
PM MAIL   Вверх
leniviy
Дата 17.4.2011, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



hwndApp - глобальная переменная типа HWND. В ней содержится описатель главного окна программы.
В примере опущена. Если создашь в студии с помощью мастера новый проект типа win32 application, то скорее всего в главном cpp файле будет объявлена эта переменная (возможно она будет называться не hwndApp, но тип у неё будет HWND )

PM MAIL   Вверх
krasgames
Дата 17.4.2011, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старый мастер
*


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

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



Так это будет не консольное приложение?
PM MAIL   Вверх
bsa
Дата 17.4.2011, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(krasgames @  17.4.2011,  13:56 Найти цитируемый пост)
Вообще мы по специальности С++ изучали, но с уклоном в нужную сторону.

C++ он и в африке С++. Уклонов у него нет.

На сколько я помню, основная твоя задача, проверить, имеется ли звуковуха или спикер в ноутбуке. Не думаю, что писать программу на С++ для этого является самым оптимальным путем. Проще проверить физическое наличие выходов и в диспетчере устройств наличие соответствующего девайса. Если там нет звуковухи, то пытаться воспроизвести звук глупо.
Для начала, можно вообще попробовать кликнуть на wav файл. Если винда ругнется, что нет устройства для воспроизведения, то можно откладывать ноут в сторону. Если начнет играть, но звука не будет, то следует попробовать подергать регуляторы громкости. Если не поможет, то с большой долей вероятности звуковуха (частично) сгорела, и ноут опять можно откладывать.
PM   Вверх
krasgames
Дата 20.4.2011, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старый мастер
*


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

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



Цитата
C++ он и в африке С++. Уклонов у него нет.
 Мы создавали консольные приложения, проводили математические вычисления и выводили результаты на экран. Я это имею ввиду. Не трогали работу процессора с внешними устройствами (кроме клавушки и монитора). С++ ярче и разнообразнее, чем кажется ;) smile Да мы и не пользовались сторонними библиотеками, юзали самые примитивные функции.
Цитата
Проще проверить физическое наличие выходов и в диспетчере устройств наличие соответствующего девайса

Нет. Моя цель - сгенерировать чистую синусоиду на выходе. Делаю частотомер, хочу замутить компьютерный генератор сигналов. Поэтому решение задачи невозможно данным путем. Про спикер хотел для личного развития. В дальнейшем виднеются цели, связанные с созданием произвольных сигналов, поэтому хочу все-таки придерживаться языка программирования.

Добавлено @ 11:37
Цитата
http://forum.vingrad.ru/forum/topic-311554.html
 Я создавал уже тему и забылsmile Сорри за 2 темы, это про одно и то же:(

Это сообщение отредактировал(а) krasgames - 20.4.2011, 11:37
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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