Форум программистов, компьютерный форум CyberForum.ru

DirectSound. Шум - C++

Восстановить пароль Регистрация
 
Reflake
0 / 0 / 0
Регистрация: 15.06.2013
Сообщений: 4
23.01.2014, 15:39     DirectSound. Шум #1
DirectSound не производит звуки, если точнее то он производит лишь первый сэмпл (4 байта) .wav файла, в итоге слышен только шум. Файлы читаются правильно, думаю проблема в буферах.
Использую DirectX SDK (June 2010)

Код инициализации DirectSound и создания первичного буфера
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
void InitSoundDevice(HWND hWnd)
{
    if (FAILED(DirectSoundCreate8(NULL,&dsDevice,NULL)))
        DebugBreak();
    if (FAILED(dsDevice->SetCooperativeLevel(hWnd,DSSCL_PRIORITY)))
        DebugBreak();
    
    DSBUFFERDESC dsbd;
    memset(&dsbd,0,sizeof(DSBUFFERDESC));
 
    dsbd.dwSize        = sizeof(DSBUFFERDESC);
    dsbd.dwFlags       = DSBCAPS_PRIMARYBUFFER | DSBCAPS_CTRLVOLUME;
    dsbd.dwBufferBytes = 0;
    dsbd.lpwfxFormat   = NULL;
 
 
    WAVEFORMATEX wfex;
    memset(&wfex,0, sizeof(WAVEFORMATEX));
 
    wfex.wFormatTag      = WAVE_FORMAT_PCM;
    wfex.nChannels       = 2;
    wfex.nSamplesPerSec  = 22050;
    wfex.wBitsPerSample  = 16;
    wfex.nBlockAlign     = 4;
    wfex.nAvgBytesPerSec = wfex.nSamplesPerSec * wfex.nBlockAlign;
 
    if (FAILED(dsDevice->CreateSoundBuffer(&dsbd,&primaryBuff,NULL)))
        DebugBreak();
    
    if (FAILED(primaryBuff->SetFormat(&wfex)))
        DebugBreak();
 
    if (FAILED(primaryBuff->Play(0,0,DSBPLAY_LOOPING)))
        DebugBreak();
 
};
Код чтения .wav файлов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
WaveSound::WaveSound(const wchar_t *path)
{
    unsigned char str[4];
 
    memset(&format,0,sizeof(WAVEFORMATEX));
    format.wFormatTag=WAVE_FORMAT_PCM;
 
    std::basic_ifstream<unsigned char> stream(path,std::ios::in);
    stream.seekg(22,stream.beg);
 
    // кол-во каналов
    stream.read(str,2);
    format.nChannels=str[0]+(str[1]<<8);
 
    // сэмплы в секунду
    stream.read(str,4);
    format.nSamplesPerSec=str[0] + (str[1]<<8) + (str[2]<<16) + (str[3]<<24);
 
    // битрейт (биты в секунду)
    stream.read(str,4);
    format.nAvgBytesPerSec=str[0] + (str[1]<<8) + (str[2]<<16) + (str[3]<<24);
 
    // байты за сэмпл (включая каналы)
    stream.read(str,2);
    format.nBlockAlign=str[0]+(str[1]<<8);
 
    // бит за один сэмпл
    stream.read(str,2);
    format.wBitsPerSample=str[0]+(str[1]<<8);
 
    stream.seekg(40,stream.beg);
 
    // размер в байтах
    stream.read(str,4);
    size=str[0] + (str[1]<<8) + (str[2]<<16) + (str[3]<<24);
 
    // Создание буфера
    // описание буфера
    DSBUFFERDESC bDesc;
    memset(&bDesc,0,sizeof(DSBUFFERDESC));
    bDesc.dwSize=sizeof(DSBUFFERDESC);
    bDesc.lpwfxFormat=&format;
    bDesc.dwFlags=DSBCAPS_CTRLVOLUME | DSBCAPS_LOCSOFTWARE | DSBCAPS_STATIC;
    bDesc.dwBufferBytes=size;
 
    // получаем 8 версию интерфейса буфера
    {
        IDirectSoundBuffer *buff;
        if (FAILED(dsDevice->CreateSoundBuffer(&bDesc,&buff,NULL)))
            DebugBreak();
        if (FAILED(buff->QueryInterface(IID_IDirectSoundBuffer8,(void**)&buffer8)))
            DebugBreak();
        buff->Release();
    }
    
    // чтение всех байтов в буфер
    if (FAILED(buffer8->Lock(0,size,(void**)&bytesPtr1,&sizePtr1,(void**)&bytesPtr2,&sizePtr2,0)))
        DebugBreak();
 
    stream.read(bytesPtr1,sizePtr1);
    if (sizePtr2)
        stream.read(bytesPtr2,sizePtr2);
 
    if (FAILED(buffer8->Unlock(bytesPtr1,sizePtr1,bytesPtr2,sizePtr2)))
        DebugBreak();
 
    stream.close();
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.01.2014, 15:39     DirectSound. Шум
Посмотрите здесь:

скачать DirectSound v 2.47(d)
DirectSound C++
Работа с DirectSound на C++ DirectX
C++ Использование DirectSound
DirectX DirectSound
Запустить DirectSound C++
DirectSound. Как правильно, и какую библиотеку следует добавить? C++
Передача звука по сети. DirectSound C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 15:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru