2013-02-14 181 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);只有一次,當第一緩衝區排隊。