char path[] = "/sdcard/testmusic.pcm";
AudioTrack *lpTrack = NULL;
static void audioCallback(int event, void* user, void *info)
{
FILE *fp = (FILE*)user;
if (event == AudioTrack::EVENT_MORE_DATA)
{
// set size to 0 to signal we're not using the callback to write more data
AudioTrack::Buffer* pBuff = (AudioTrack::Buffer*)info;
pBuff->size = 0;
if (feof(fp) == 0)
{
pBuff->size = fread(pBuff->raw, 1, 2048, fp);
}
lpTrack->flush();
}
else if ( event ==AudioTrack::EVENT_LOOP_END )
{
//fclose( fp );
//free(lpTrack);
}
else if (event == AudioTrack::EVENT_MARKER)
{
// audiotrack_callback_cookie *callbackInfo = (audiotrack_callback_cookie *)user;
// JNIEnv *env = AndroidRuntime::getJNIEnv();
// if (user && env) {
// env->CallStaticVoidMethod(
// callbackInfo->audioTrack_class,
// javaAudioTrackFields.postNativeEventInJava,
// callbackInfo->audioTrack_ref, event, 0,0, NULL);
// if (env->ExceptionCheck()) {
// env->ExceptionDescribe();
// env->ExceptionClear();
// }
// }
}
else if (event == AudioTrack::EVENT_NEW_POS)
{
// audiotrack_callback_cookie *callbackInfo = (audiotrack_callback_cookie *)user;
// JNIEnv *env = AndroidRuntime::getJNIEnv();
// if (user && env) {
// env->CallStaticVoidMethod(
// callbackInfo->audioTrack_class,
// javaAudioTrackFields.postNativeEventInJava,
// callbackInfo->audioTrack_ref, event, 0,0, NULL);
// if (env->ExceptionCheck()) {
// env->ExceptionDescribe();
// env->ExceptionClear();
// }
// }
}
}
void Java_com_jqbar_SkiaView_AudioTest(JNIEnv *env, jobject thizz)
{
char buf[4096] = "";
int offset = 0;
int num_read = 0;
FILE *fp = NULL;
fp = fopen(path, "r");;
// fseek(fp, 0, SEEK_END);
// int fileSize = ftell(fp);
// rewind(fp);
lpTrack = new AudioTrack(
AudioSystem::MUSIC,// stream type
44100,
AudioSystem::PCM_16_BIT,// word length, PCM
AudioSystem::CHANNEL_OUT_STEREO,
0, 0, audioCallback, fp, 0 );
lpTrack->initCheck();
lpTrack->setVolume(1.0, 1.0);
lpTrack->start();
}
AudioTrack *lpTrack = NULL;
static void audioCallback(int event, void* user, void *info)
{
FILE *fp = (FILE*)user;
if (event == AudioTrack::EVENT_MORE_DATA)
{
// set size to 0 to signal we're not using the callback to write more data
AudioTrack::Buffer* pBuff = (AudioTrack::Buffer*)info;
pBuff->size = 0;
if (feof(fp) == 0)
{
pBuff->size = fread(pBuff->raw, 1, 2048, fp);
}
lpTrack->flush();
}
else if ( event ==AudioTrack::EVENT_LOOP_END )
{
//fclose( fp );
//free(lpTrack);
}
else if (event == AudioTrack::EVENT_MARKER)
{
// audiotrack_callback_cookie *callbackInfo = (audiotrack_callback_cookie *)user;
// JNIEnv *env = AndroidRuntime::getJNIEnv();
// if (user && env) {
// env->CallStaticVoidMethod(
// callbackInfo->audioTrack_class,
// javaAudioTrackFields.postNativeEventInJava,
// callbackInfo->audioTrack_ref, event, 0,0, NULL);
// if (env->ExceptionCheck()) {
// env->ExceptionDescribe();
// env->ExceptionClear();
// }
// }
}
else if (event == AudioTrack::EVENT_NEW_POS)
{
// audiotrack_callback_cookie *callbackInfo = (audiotrack_callback_cookie *)user;
// JNIEnv *env = AndroidRuntime::getJNIEnv();
// if (user && env) {
// env->CallStaticVoidMethod(
// callbackInfo->audioTrack_class,
// javaAudioTrackFields.postNativeEventInJava,
// callbackInfo->audioTrack_ref, event, 0,0, NULL);
// if (env->ExceptionCheck()) {
// env->ExceptionDescribe();
// env->ExceptionClear();
// }
// }
}
}
void Java_com_jqbar_SkiaView_AudioTest(JNIEnv *env, jobject thizz)
{
char buf[4096] = "";
int offset = 0;
int num_read = 0;
FILE *fp = NULL;
fp = fopen(path, "r");;
// fseek(fp, 0, SEEK_END);
// int fileSize = ftell(fp);
// rewind(fp);
lpTrack = new AudioTrack(
AudioSystem::MUSIC,// stream type
44100,
AudioSystem::PCM_16_BIT,// word length, PCM
AudioSystem::CHANNEL_OUT_STEREO,
0, 0, audioCallback, fp, 0 );
lpTrack->initCheck();
lpTrack->setVolume(1.0, 1.0);
lpTrack->start();
}