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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа со звуком, организация буфера данных 
:(
    Опции темы
leamas
Дата 5.5.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня программа воспроизводит и записывает в файл звук одной частоты
Код

DWORD GenerateWave(DWORD dwWaveFreq, DWORD dwDuration, RIFF **ppRiff)
{
     const DWORD dwSamplingRate = 44100; 
    const DWORD dwBitsPerSample = 8;
    const DWORD dwSamplesCount = dwDuration * dwSamplingRate / 1000;
    const DWORD dwWaveDataLength = dwSamplesCount * dwBitsPerSample / CHAR_BIT;
    const DWORD dwRiffSize = sizeof(RIFF) + dwWaveDataLength - 1;

    RIFF *pRiff = (RIFF *)new BYTE[dwRiffSize];

    pRiff->rID = FOURCC("RIFF"); 
    pRiff->rLen = sizeof(WAVE) - 1 + dwWaveDataLength; 

    pRiff->rData.wID = FOURCC("WAVE"); 
    pRiff->rData.fID = FOURCC("fmt "); 
    pRiff->rData.nBlockAlign = dwBitsPerSample / CHAR_BIT; 
    pRiff->rData.nChannels = 1; 
    pRiff->rData.nSamplesPerSec = dwSamplingRate; 
    pRiff->rData.FormatSpecific = 8; // hz 
    pRiff->rData.fLen = 16; 
    pRiff->rData.wFormatTag = 1; 
    pRiff->rData.nAvgBytesPerSec = dwSamplingRate * dwBitsPerSample / CHAR_BIT; 
    pRiff->rData.wd.dID = FOURCC("data"); 
    pRiff->rData.wd.dLen = dwWaveDataLength; 
    
    for(DWORD i = 0; i < dwSamplesCount; ++i)
    { 
        double dCurrTime = i / (double)dwSamplingRate; 
        
        double dAmplitude = sin(dCurrTime * dwWaveFreq * 2 * M_PI); 
        
        pRiff->rData.wd.dData[i] = (BYTE)(0.5 * (dAmplitude + 1.0) * UCHAR_MAX);

    } 
    *ppRiff = pRiff;        
    return dwRiffSize
}
void ReleaseWave(RIFF *pRiff)
{
    BYTE *pData = (BYTE *)pRiff;
    delete [] pData;
}
int main(int argc, char* argv[])
{
    RIFF *pRiff;
    DWORD dwRiffSize=  GenerateWave(900, 1000, &pRiff);    
     PlaySound((const char*)pRiff, 0, SND_MEMORY);         
     HANDLE hFile = CreateFile("test.wav", GENERIC_READ | GENERIC_WRITE, 0,
        NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

    if (hFile != INVALID_HANDLE_VALUE)
    {
        DWORD dwBytes;
        WriteFile(hFile, pRiff, dwRiffSize, &dwBytes, NULL);  
        CloseHandle(hFile);
    }    
    delete pRiff;


как я понимаю, чтобы проиграть и записать несколько нот, надо организовать буфер, в который записывались бы данные из pRiff по очереди при каждом вызове  GenerateWave() и прописать его в WriteFile и PlaySound. 
Но что-то мои попытки не увенчались успехом((
Подскажите, пож, правильно ли я понимаю?
И если правильно, то можно ли для этого использовать подобный алгоритм: 
http://forum.vingrad.ru/topic-19407.html
Да и с размером записываемого файла надо что-то делать (dwRiffSize в WriteFile)...


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

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

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

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

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


 




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


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

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