2013-02-14 127 views
0

我需要用OpenAL播放流声音。这是我的代码,但它不起作用。我需要做什么?播放流声音OpenAL

device = alcOpenDevice(NULL); 
    // 
    ofstream file; 
    file.open("TESTSPEAKER", std::ios_base::binary); 
    context = alcCreateContext(device, NULL); 
    alcMakeContextCurrent(context); 
    // alGetError(); 
    char *alBuffer; 
    ALenum alFormatBuffer; 
    ALsizei alFreqBuffer; 
    long alBufferLen; 
    ALboolean alLoop; 
    unsigned int alSource; 
    unsigned int alSampleSet; 
    boost::array <char, 882> buf; 
    while (!ExitKey) 
    { 
     boost::system::error_code error; 
     size_t len = VoiceSocket->read_some(boost::asio::buffer(buf), error); 
     if (len==0) 
     { 
      continue; 
     } 
     file.write(buf.data(), 882); 
     alGenSources(1, &alSource); 
     alGenBuffers(1, &alSampleSet); 
     alBufferData(alSource, AL_FORMAT_MONO16, buf.data(), buf.size(), 44100); 
     alSourcei(alSource, AL_BUFFER, alSampleSet); 
     // 
     //alSourcei(alSource, AL_LOOPING, alSampleSet); 


      alSourcePlay(alSource); 

     //alSourcePlay(alSource); 
    } 
    VoiceSocket->close(); 
    file.close(); 

如果我看到我的文件(“TESTSPEAKER”),我看我的声音。所以我正确地传递了网络。但是我怎么能用openal来播放这个声音呢?

+0

我需要播放每10ms,882个字节的声音(MONO16)。这个声音在“buf”变量中。 – EXTRAM 2013-02-14 12:09:51

回答

0

如果你是流媒体,那么你应该使用

alSourceQueueBuffers(alSource, 1, &alSampleSet); 

,而不是将其设置为静态缓冲区,像

alSourcei(alSource, AL_BUFFER, alSampleSet); 

并发出命令alSourcePlay(alSource);只有一次,当第一缓冲区排队。