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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PlaySound 
V
    Опции темы
Tony
Дата 18.3.2009, 04:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1159
Регистрация: 3.3.2006
Где: Riga

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



Привет всем smile. Вот нашёл код в Фак. Винграда. Запустил его но ошибками при компиляции, исправил чтоб не валился, но звука нет  smile . Попробывал файл проиграть из файловой системы - работает. Помогите разобрсятся в чём проблема. 
Код

#include "stdafx.h"
#include <windows.h>
#include "math.h"

// подключаем LIB-файл для ф-ции PlaySound
#pragma comment(lib, "winmm.lib")
// описание заголовка файла WAV
struct WAVHEADER
{
    char    sigRIFF[5];     // должно быть равно "RIFF"
    DWORD   sizeRIFFch;     // размер чанка RIFF
    char    sigWAVE[5];     // должно быть равно "WAVE"
    char    sigFMT[5];      // должно быть равно "fmt "
    DWORD   sizeFMTch;      // размер чанка FMT
    WORD    wFormatTag;     // категория формата, для PCM = 1
    WORD    wChannels;      // кол-во каналов: 1-моно 2-стерео
    DWORD   dwSamplesPerSec;// кол-во сэмплов в сек.
    DWORD   dwAvgBytesPerSec;// среднее число байт в сек
    WORD    wBlockAlign;    // выравнивание данных в дата-чанке
    WORD    wBitPerSample;  // бит в сэмпле
    char    sigDATA[5];     // должно быть равно "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_s(head->sigRIFF, "RIFF");
    strcpy_s(head->sigWAVE, "WAVE");
    head->sizeRIFFch = size - 8;
    strcpy_s(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_s(head->sigDATA, "data");
    head->sizeDATAch = size;
    // заполняем дорожку периодом синуса
    BYTE *samples = (BYTE*)(head+1);
    for(DWORD i=0; i<numSamples; i++)
        samples[i] = BYTE(255*sin(6.28*double(i)/double(size)));
    // проигрываем звук
   // PlaySound((const char*)buff, 0, SND_ASYNC|SND_LOOP|SND_MEMORY);
    PlaySound((LPCWSTR)buff, 0, SND_ASYNC|SND_LOOP|SND_MEMORY);

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

    PlaySound(0, 0, SND_ASYNC);
}

//////////////////////////////////////////////////////////////////////////
// Тестовый звук - 900 Гц, одна секунда
int main(int argc, char* argv[])
{[quote]

[/quote]
    /*
    int i = PlaySound(TEXT("1.wav"), NULL, SND_SYNC | SND_FILENAME);
    if (i==S_OK){
        printf("%s","allOk" );
    }else{
        printf("%s","error" );
    }
*/
    //Beep(500, 200) ;

    //Sleep(5000);
    SuperBeep(900, 1000);
    return 0;
}



--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
dumb
Дата 18.3.2009, 05:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



Код

#pragma pack(push,1) // в данном случае не обязательно(но лучше оставить для ясности)
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-чанка
};
#pragma pack(pop)
...
  memcpy(head->sigRIFF, "RIFF", 4);
  // и все остальные strcpy_s заменить по аналогии

PM MAIL   Вверх
586
Дата 18.3.2009, 05:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ошибки три:
1. Нету pragma pack
2. sigRIFF, sigWAVE и т.п. должны состоять из четырёх элементов, а не из пяти (в оригинальном коде в FAQ там 4 элемента).
3. Вместо strcpy нужно memcpy.
Код
#include <windows.h>
#include "math.h"
// подключаем LIB-файл для ф-ции PlaySound
#pragma comment(lib, "winmm.lib")
// описание заголовка файла WAV
#pragma pack (push, 1)
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-чанка
};
#pragma pack (pop)

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;
    memcpy(head->sigRIFF, "RIFF", 4);
    memcpy(head->sigWAVE, "WAVE", 4);
    head->sizeRIFFch = size - 8;
    memcpy(head->sigFMT, "fmt ", 4);
    head->sizeFMTch = 16;
    head->wFormatTag = 1;
    head->wChannels = 1; // моно
    head->dwSamplesPerSec = 44100;
    head->dwAvgBytesPerSec = 44100;
    head->wBlockAlign = 1;
    head->wBitPerSample = 8;
    memcpy(head->sigDATA, "data", 4);
    head->sizeDATAch = size;
    // заполняем дорожку периодом синуса
    BYTE *samples = (BYTE*)(head+1);
    for(DWORD i=0; i<numSamples; i++)
        samples[i] = BYTE(255*sin(6.28*double(i)/double(size)));
    // проигрываем звук
   // PlaySound((const char*)buff, 0, SND_ASYNC|SND_LOOP|SND_MEMORY);
    PlaySound((LPCTSTR)buff, 0, SND_ASYNC|SND_LOOP|SND_MEMORY);
    // ждём заданное количество миллисекунд
    Sleep(dwMilliSeconds);
    // останавливаем звук
    PlaySound(0, 0, SND_ASYNC);
}
//////////////////////////////////////////////////////////////////////////
// Тестовый звук - 900 Гц, одна секунда
int main(int argc, char* argv[])
{
    /*
    int i = PlaySound(TEXT("1.wav"), NULL, SND_SYNC | SND_FILENAME);
    if (i==S_OK){
        printf("%s","allOk" );
    }else{
        printf("%s","error" );
    }
*/
    //Beep(500, 200) ;
    //Sleep(5000);
    SuperBeep(900, 1000);
    return 0;
}

PM   Вверх
Tony
Дата 18.3.2009, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1159
Регистрация: 3.3.2006
Где: Riga

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



Спасибо  smile , помогло. 


--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0706 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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