static void SNDSDLUpdateAudio(u32 *leftchanbuffer, u32 *rightchanbuffer, u32 num_samples) { u32 copy1size=0, copy2size=0; SDL_LockAudio(); if ((soundbufsize - soundoffset) < (num_samples * sizeof(s16) * 2)) { copy1size = (soundbufsize - soundoffset); copy2size = (num_samples * sizeof(s16) * 2) - copy1size; } else { copy1size = (num_samples * sizeof(s16) * 2); copy2size = 0; } sdlConvert32uto16s((s32 *)leftchanbuffer, (s32 *)rightchanbuffer, (s16 *)(((u8 *)stereodata16)+soundoffset), copy1size / sizeof(s16) / 2); if (copy2size) sdlConvert32uto16s((s32 *)leftchanbuffer + (copy1size / sizeof(s16) / 2), (s32 *)rightchanbuffer + (copy1size / sizeof(s16) / 2), (s16 *)stereodata16, copy2size / sizeof(s16) / 2); soundoffset += copy1size + copy2size; soundoffset %= soundbufsize; SDL_UnlockAudio(); }
static void SNDAudioTrackUpdateAudio(u32 *leftchanbuffer, u32 *rightchanbuffer, u32 num_samples) { u32 copy1size=0; copy1size = (num_samples * sizeof(s16) * 2); sdlConvert32uto16s((s32 *)leftchanbuffer, (s32 *)rightchanbuffer, (s16 *)(((u8 *)stereodata16)+soundoffset), copy1size / sizeof(s16) / 2); soundoffset += copy1size; if (soundoffset > mbufferSizeInBytes) { if (! muted) { JNIEnv * env; jbyteArray array; if ((*yvm)->GetEnv(yvm, (void**) &env, JNI_VERSION_1_6) != JNI_OK) return; array = (*env)->NewByteArray(env, soundoffset); if(array) { (*env)->SetByteArrayRegion(env, array, 0, soundoffset, (u8 *) stereodata16); } (*env)->CallNonvirtualIntMethod(env, gtrack, cAudioTrack, mWrite, array, 0, soundoffset); } soundoffset = 0; } }
static void SNDOpenSLUpdateAudio(u32 *leftchanbuffer, u32 *rightchanbuffer, u32 num_samples) { // return; u32 copy1size=0; int nextpos; copy1size = (num_samples * sizeof(s16) * 2); //printf("SNDOpenSLUpdateAudio %08X,%08X,%08X",currentpos,soundoffset[currentpos],copy1size); sdlConvert32uto16s((s32 *)leftchanbuffer, (s32 *)rightchanbuffer, (s16 *)(((u8 *)stereodata16[currentpos])+soundoffset[currentpos] ), copy1size / sizeof(s16) / 2); soundoffset[currentpos] += copy1size; if (soundoffset[currentpos] >= mbufferSizeInBytes) { if (!muted) { // here we only enqueue one buffer because it is a long clip, // but for streaming playback we would typically enqueue at least 2 buffers to start SLresult result; push_index(currentpos); result = (*bqPlayerBufferQueue)->Enqueue(bqPlayerBufferQueue, stereodata16[currentpos], soundoffset[currentpos]); if (SL_RESULT_SUCCESS != result) { printf("Fail to Add queue"); return; } } nextpos = currentpos+1; if( nextpos >= MAX_BUFFER_CNT ) { nextpos = 0; } currentpos = nextpos; } }
static void SNDLIBRETROUpdateAudio(u32 *leftchanbuffer, u32 *rightchanbuffer, u32 num_samples) { s16 sound_buf[4096]; sdlConvert32uto16s((int32_t*)leftchanbuffer, (int32_t*)rightchanbuffer, sound_buf, num_samples); audio_batch_cb(sound_buf, num_samples); audio_size -= num_samples; }