Path: blob/master/yabause/src/android/jni/sndaudiotrack.c
2 views
/* Copyright 2012 Guillaume Duhamel1Copyright 2005-2006 Theo Berkau23This file is part of Yabause.45Yabause is free software; you can redistribute it and/or modify6it under the terms of the GNU General Public License as published by7the Free Software Foundation; either version 2 of the License, or8(at your option) any later version.910Yabause is distributed in the hope that it will be useful,11but WITHOUT ANY WARRANTY; without even the implied warranty of12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the13GNU General Public License for more details.1415You should have received a copy of the GNU General Public License16along with Yabause; if not, write to the Free Software17Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA18*/1920#include <jni.h>21#include <android/log.h>22#include "sndaudiotrack.h"23#include "debug.h"2425static int SNDAudioTrackInit(void);26static void SNDAudioTrackDeInit(void);27static int SNDAudioTrackReset(void);28static int SNDAudioTrackChangeVideoFormat(int vertfreq);29static void SNDAudioTrackUpdateAudio(u32 *leftchanbuffer, u32 *rightchanbuffer, u32 num_samples);30static u32 SNDAudioTrackGetAudioSpace(void);31static void SNDAudioTrackMuteAudio(void);32static void SNDAudioTrackUnMuteAudio(void);33static void SNDAudioTrackSetVolume(int volume);3435SoundInterface_struct SNDAudioTrack = {36SNDCORE_AUDIOTRACK,37"Audio Track Sound Interface",38SNDAudioTrackInit,39SNDAudioTrackDeInit,40SNDAudioTrackReset,41SNDAudioTrackChangeVideoFormat,42SNDAudioTrackUpdateAudio,43SNDAudioTrackGetAudioSpace,44SNDAudioTrackMuteAudio,45SNDAudioTrackUnMuteAudio,46SNDAudioTrackSetVolume47};4849extern JavaVM * yvm;5051jobject gtrack = NULL;5253jclass cAudioTrack = NULL;5455jmethodID mWrite = NULL;5657int mbufferSizeInBytes;5859static u16 *stereodata16;60static u8 soundvolume;61static u8 soundmaxvolume;62static u8 soundbufsize;63static int soundoffset;6465//////////////////////////////////////////////////////////////////////////////6667static int SNDAudioTrackInit(void)68{69int sampleRateInHz = 44100;70int channelConfig = 12; //AudioFormat.CHANNEL_OUT_STEREO71int audioFormat = 2; //AudioFormat.ENCODING_PCM_16BIT72JNIEnv * env;73jobject mtrack = NULL;74jmethodID mPlay = NULL;75jmethodID mGetMinBufferSize = NULL;76jmethodID mAudioTrack = NULL;7778if ((*yvm)->GetEnv(yvm, (void**) &env, JNI_VERSION_1_6) != JNI_OK)79return -1;8081cAudioTrack = (*env)->FindClass(env, "android/media/AudioTrack");8283mAudioTrack = (*env)->GetMethodID(env, cAudioTrack, "<init>", "(IIIIII)V");8485mWrite = (*env)->GetMethodID(env, cAudioTrack, "write", "([BII)I");8687mPlay = (*env)->GetMethodID(env, cAudioTrack, "play", "()V");8889mGetMinBufferSize = (*env)->GetStaticMethodID(env, cAudioTrack, "getMinBufferSize", "(III)I");9091mbufferSizeInBytes = (*env)->CallStaticIntMethod(env, cAudioTrack, mGetMinBufferSize, sampleRateInHz, channelConfig, audioFormat);9293mtrack = (*env)->NewObject(env, cAudioTrack, mAudioTrack, 3 /* STREAM_MUSIC */, sampleRateInHz, channelConfig, audioFormat, mbufferSizeInBytes, 1 /* MODE_STREAM */);9495gtrack = (*env)->NewGlobalRef(env, mtrack);9697(*env)->CallNonvirtualVoidMethod(env, gtrack, cAudioTrack, mPlay);9899if ((stereodata16 = (u16 *)malloc(2 * mbufferSizeInBytes)) == NULL)100return -1;101memset(stereodata16, 0, soundbufsize);102103soundvolume = 100;104soundmaxvolume = 100;105soundbufsize = 85;106soundoffset = 0;107108return 0;109}110111//////////////////////////////////////////////////////////////////////////////112113static void SNDAudioTrackDeInit(void)114{115JNIEnv * env;116117if ((*yvm)->GetEnv(yvm, (void**) &env, JNI_VERSION_1_6) != JNI_OK)118return;119120free(stereodata16);121stereodata16 = NULL;122123(*env)->DeleteGlobalRef(env, gtrack);124}125126//////////////////////////////////////////////////////////////////////////////127128static int SNDAudioTrackReset(void)129{130return 0;131}132133//////////////////////////////////////////////////////////////////////////////134135static int SNDAudioTrackChangeVideoFormat(int vertfreq)136{137return 0;138}139140//////////////////////////////////////////////////////////////////////////////141142static void sdlConvert32uto16s(s32 *srcL, s32 *srcR, s16 *dst, u32 len) {143u32 i;144145for (i = 0; i < len; i++)146{147// Left Channel148*srcL = ( *srcL *soundvolume ) / soundmaxvolume;149if (*srcL > 0x7FFF) *dst = 0x7FFF;150else if (*srcL < -0x8000) *dst = -0x8000;151else *dst = *srcL;152srcL++;153dst++;154// Right Channel155*srcR = ( *srcR *soundvolume ) / soundmaxvolume;156if (*srcR > 0x7FFF) *dst = 0x7FFF;157else if (*srcR < -0x8000) *dst = -0x8000;158else *dst = *srcR;159srcR++;160dst++;161}162}163164static void SNDAudioTrackUpdateAudio(u32 *leftchanbuffer, u32 *rightchanbuffer, u32 num_samples)165{166u32 copy1size=0;167168copy1size = (num_samples * sizeof(s16) * 2);169170sdlConvert32uto16s((s32 *)leftchanbuffer, (s32 *)rightchanbuffer, (s16 *)(((u8 *)stereodata16)+soundoffset), copy1size / sizeof(s16) / 2);171172soundoffset += copy1size;173174if (soundoffset > mbufferSizeInBytes) {175JNIEnv * env;176if ((*yvm)->GetEnv(yvm, (void**) &env, JNI_VERSION_1_6) != JNI_OK)177return;178179jshortArray array = (*env)->NewShortArray(env, soundoffset);180if(array) {181(*env)->SetShortArrayRegion(env, array, 0, soundoffset, stereodata16);182}183184(*env)->CallNonvirtualIntMethod(env, gtrack, cAudioTrack, mWrite, array, 0, soundoffset);185186soundoffset = 0;187}188}189190//////////////////////////////////////////////////////////////////////////////191192static u32 SNDAudioTrackGetAudioSpace(void)193{194static int i = 0;195i++;196if (i == 55) {197i = 0;198return mbufferSizeInBytes;199} else {200return 0;201}202}203204//////////////////////////////////////////////////////////////////////////////205206static void SNDAudioTrackMuteAudio(void)207{208}209210//////////////////////////////////////////////////////////////////////////////211212static void SNDAudioTrackUnMuteAudio(void)213{214}215216//////////////////////////////////////////////////////////////////////////////217218static void SNDAudioTrackSetVolume(int volume)219{220}221222223