Показать сообщение отдельно
Старый 15.08.2012, 21:36   #3
616}[aKeP
Нуждающийся
 
Аватар для 616}[aKeP
 
Регистрация: 23.02.2011
Сообщений: 54
Написано 3 полезных сообщений
(для 5 пользователей)
Ответ: Wav файл, XAudio2 и белый шум. Проблема(

Тогда вот впринципе код, файл проверял, частота, битрейт совпадает(при дебаге смотрел). Что не так не знаю(

#include"windows.h"
#include<string>
#include"XAudio2.h"

struct sWavHeader
    
{
        
// WAV-формат начинается с RIFF-заголовка:

        // Содержит символы "RIFF" в ASCII кодировке
        // (0x52494646 в big-endian представлении)
        
char m_cChunkId[4];

        
// 36 + subchunk2Size, или более точно:
        // 4 + (8 + subchunk1Size) + (8 + subchunk2Size)
        // Это оставшийся размер цепочки, начиная с этой позиции.
        // Иначе говоря, это размер файла - 8, то есть,
        // исключены поля chunkId и chunkSize.
        
DWORD m_dwChunkSize;

        
// Содержит символы "WAVE"
        // (0x57415645 в big-endian представлении)
        
char m_cFormat[4];

        
// Формат "WAVE" состоит из двух подцепочек: "fmt " и "data":
        // Подцепочка "fmt " описывает формат звуковых данных:
    
        // Содержит символы "fmt "
        // (0x666d7420 в big-endian представлении)
        
char m_cSubchunk1Id[4];

        
// 16 для формата PCM.
        // Это оставшийся размер подцепочки, начиная с этой позиции.
        
DWORD m_dwSubchunk1Size;

        
// Аудио формат, полный список можно получить здесь http://audiocoding.ru/wav_formats.txt
        // Для PCM = 1 (то есть, Линейное квантование).
        // Значения, отличающиеся от 1, обозначают некоторый формат сжатия.
        
WORD m_wAudioFormat;

        
// Количество каналов. Моно = 1, Стерео = 2 и т.д.
        
WORD m_wNumChannels;

        
// Частота дискретизации. 8000 Гц, 44100 Гц и т.д.
        
DWORD m_dwSampleRate;

        
// sampleRate * numChannels * bitsPerSample/8
        
DWORD m_dwByteRate;

        
// numChannels * bitsPerSample/8
        // Количество байт для одного сэмпла, включая все каналы.
        
WORD m_wBlockAlign;

        
// Так называемая "глубиная" или точность звучания. 8 бит, 16 бит и т.д.
        
WORD m_wBitsPerSample;

        
// Подцепочка "data" содержит аудио-данные и их размер.

        // Содержит символы "data"
        // (0x64617461 в big-endian представлении)
        
char m_cSubchunk2Id[4];

        
// numSamples * numChannels * bitsPerSample/8
        // Количество байт в области данных.
        
DWORD m_dwSubchunk2Size;

        
// Далее следуют непосредственно Wav данные.
    
};


    
//Заголовок wav файла
    
WAVEFORMATEX g_sDataDesc;

    
//Интерфейс звука
    
IXAudio2SourceVoiceg_pSource;

    
//Буффер и информация о аудио данных для интерфейса
    
XAUDIO2_BUFFER g_sBuffer;

    
//Основной аудио интерфейс
    
IXAudio2g_pAudio;
            
    
//Основной голос
    
IXAudio2MasteringVoiceg_pMasteringVoice;

    
//Хендл файла
    
HANDLE v_hFile;

    
//Структура загаловка wav файла
    
sWavHeader v_sWavHeader;

    
//Буффер данных из файла
    
BYTEg_pBuffer;

    
//Считаные байты
    
DWORD v_dwReadBytes;

int __stdcall WinMain(HINSTANCE a_hInstance,
                      
HINSTANCE a_hPrevInstance,
                      
LPSTR a_pCmdLineint a_iCmdShow)
{
    



                
CoInitializeEx(0,COINIT_MULTITHREADED);
                if(
FAILED(XAudio2Create(&g_pAudio)))
                {
                    
MessageBox(NULL"Can't create main audio interface.""Error"MB_OK);
                    return 
false;
                }
                
g_pAudio->CreateMasteringVoice(&g_pMasteringVoice);

                
                
                
//Открываем файл и считываем информацию об аудио файле
                
v_hFile=CreateFile("Grom.wav",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,NULL,0);
                
ReadFile(v_hFile,(void*)&v_sWavHeader,sizeof(sWavHeader),&v_dwReadBytes,NULL);
                
//Выделяю память под буффер
                
g_pBuffer=new BYTE[v_sWavHeader.m_dwChunkSize-36];
                
//Считываю аудио данные
                
ReadFile(v_hFile,(void*)g_pBuffer,v_sWavHeader.m_dwChunkSize-36,&v_dwReadBytes,NULL);
                
CloseHandle(v_hFile);

                
//Заполняю структуры для хаудио2
                
g_sDataDesc.wFormatTag=1;
                
g_sDataDesc.nChannels=v_sWavHeader.m_wNumChannels;
                
g_sDataDesc.nSamplesPerSec=v_sWavHeader.m_dwSampleRate;
                
g_sDataDesc.nAvgBytesPerSec=v_sWavHeader.m_dwByteRate;
                
g_sDataDesc.nBlockAlign=v_sWavHeader.m_wBlockAlign;
                
g_sDataDesc.wBitsPerSample=v_sWavHeader.m_wBitsPerSample;
                
g_sDataDesc.cbSize=18;
                
g_sBuffer.Flags=XAUDIO2_END_OF_STREAM;
                
g_sBuffer.AudioBytes=v_sWavHeader.m_dwChunkSize-36;
                
g_sBuffer.pAudioData=g_pBuffer;
                
g_sBuffer.PlayBegin=0;
                
g_sBuffer.PlayLength=0;
                
g_sBuffer.LoopBegin=0;
                
g_sBuffer.LoopLength=0;
                
g_sBuffer.LoopCount=XAUDIO2_LOOP_INFINITE;

                
//Создаю источник
                
g_pAudio->CreateSourceVoice(&g_pSource,&g_sDataDesc);

                
//Передаю информацию в буффер
                
g_pSource->SubmitSourceBuffer(&g_sBuffer);

                
//И о божественная какашка, почему ты проигрываешь белый шум!!!!!!
                
g_pSource->Start();
    
                
MessageBox(NULL"Stop.""Message"MB_OK);
                
g_pSource->Stop();
                
g_pSource->DestroyVoice();
                
g_pMasteringVoice->DestroyVoice();
                
g_pAudio->Release();
                
CoUninitialize();
                return 
0;

(Offline)
 
Ответить с цитированием