am 63183ff2: Merge "Update native-audio example app"
* commit '63183ff22733a4bc8cb8aa52730c862481038554': Update native-audio example app
This commit is contained in:
@@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
// for native audio
|
// for native audio
|
||||||
#include <SLES/OpenSLES.h>
|
#include <SLES/OpenSLES.h>
|
||||||
#include "SLES/OpenSLES_Android.h"
|
#include <SLES/OpenSLES_Android.h>
|
||||||
|
|
||||||
// for native asset manager
|
// for native asset manager
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
@@ -60,6 +60,8 @@ static SLObjectItf bqPlayerObject = NULL;
|
|||||||
static SLPlayItf bqPlayerPlay;
|
static SLPlayItf bqPlayerPlay;
|
||||||
static SLAndroidSimpleBufferQueueItf bqPlayerBufferQueue;
|
static SLAndroidSimpleBufferQueueItf bqPlayerBufferQueue;
|
||||||
static SLEffectSendItf bqPlayerEffectSend;
|
static SLEffectSendItf bqPlayerEffectSend;
|
||||||
|
static SLMuteSoloItf bqPlayerMuteSolo;
|
||||||
|
static SLVolumeItf bqPlayerVolume;
|
||||||
|
|
||||||
// aux effect on the output mix, used by the buffer queue player
|
// aux effect on the output mix, used by the buffer queue player
|
||||||
static const SLEnvironmentalReverbSettings reverbSettings =
|
static const SLEnvironmentalReverbSettings reverbSettings =
|
||||||
@@ -69,11 +71,15 @@ static const SLEnvironmentalReverbSettings reverbSettings =
|
|||||||
static SLObjectItf uriPlayerObject = NULL;
|
static SLObjectItf uriPlayerObject = NULL;
|
||||||
static SLPlayItf uriPlayerPlay;
|
static SLPlayItf uriPlayerPlay;
|
||||||
static SLSeekItf uriPlayerSeek;
|
static SLSeekItf uriPlayerSeek;
|
||||||
|
static SLMuteSoloItf uriPlayerMuteSolo;
|
||||||
|
static SLVolumeItf uriPlayerVolume;
|
||||||
|
|
||||||
// file descriptor player interfaces
|
// file descriptor player interfaces
|
||||||
static SLObjectItf fdPlayerObject = NULL;
|
static SLObjectItf fdPlayerObject = NULL;
|
||||||
static SLPlayItf fdPlayerPlay;
|
static SLPlayItf fdPlayerPlay;
|
||||||
static SLSeekItf fdPlayerSeek;
|
static SLSeekItf fdPlayerSeek;
|
||||||
|
static SLMuteSoloItf fdPlayerMuteSolo;
|
||||||
|
static SLVolumeItf fdPlayerVolume;
|
||||||
|
|
||||||
// recorder interfaces
|
// recorder interfaces
|
||||||
static SLObjectItf recorderObject = NULL;
|
static SLObjectItf recorderObject = NULL;
|
||||||
@@ -199,10 +205,12 @@ void Java_com_example_nativeaudio_NativeAudio_createBufferQueueAudioPlayer(JNIEn
|
|||||||
SLDataSink audioSnk = {&loc_outmix, NULL};
|
SLDataSink audioSnk = {&loc_outmix, NULL};
|
||||||
|
|
||||||
// create audio player
|
// create audio player
|
||||||
const SLInterfaceID ids[2] = {SL_IID_BUFFERQUEUE, SL_IID_EFFECTSEND};
|
const SLInterfaceID ids[3] = {SL_IID_BUFFERQUEUE, SL_IID_EFFECTSEND,
|
||||||
const SLboolean req[2] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE};
|
/*SL_IID_MUTESOLO,*/ SL_IID_VOLUME};
|
||||||
|
const SLboolean req[3] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE,
|
||||||
|
/*SL_BOOLEAN_TRUE,*/ SL_BOOLEAN_TRUE};
|
||||||
result = (*engineEngine)->CreateAudioPlayer(engineEngine, &bqPlayerObject, &audioSrc, &audioSnk,
|
result = (*engineEngine)->CreateAudioPlayer(engineEngine, &bqPlayerObject, &audioSrc, &audioSnk,
|
||||||
2, ids, req);
|
3, ids, req);
|
||||||
assert(SL_RESULT_SUCCESS == result);
|
assert(SL_RESULT_SUCCESS == result);
|
||||||
|
|
||||||
// realize the player
|
// realize the player
|
||||||
@@ -227,6 +235,16 @@ void Java_com_example_nativeaudio_NativeAudio_createBufferQueueAudioPlayer(JNIEn
|
|||||||
&bqPlayerEffectSend);
|
&bqPlayerEffectSend);
|
||||||
assert(SL_RESULT_SUCCESS == result);
|
assert(SL_RESULT_SUCCESS == result);
|
||||||
|
|
||||||
|
#if 0 // mute/solo is not supported for sources that are known to be mono, as this is
|
||||||
|
// get the mute/solo interface
|
||||||
|
result = (*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_MUTESOLO, &bqPlayerMuteSolo);
|
||||||
|
assert(SL_RESULT_SUCCESS == result);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// get the volume interface
|
||||||
|
result = (*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_VOLUME, &bqPlayerVolume);
|
||||||
|
assert(SL_RESULT_SUCCESS == result);
|
||||||
|
|
||||||
// set the player's state to playing
|
// set the player's state to playing
|
||||||
result = (*bqPlayerPlay)->SetPlayState(bqPlayerPlay, SL_PLAYSTATE_PLAYING);
|
result = (*bqPlayerPlay)->SetPlayState(bqPlayerPlay, SL_PLAYSTATE_PLAYING);
|
||||||
assert(SL_RESULT_SUCCESS == result);
|
assert(SL_RESULT_SUCCESS == result);
|
||||||
@@ -255,10 +273,10 @@ jboolean Java_com_example_nativeaudio_NativeAudio_createUriAudioPlayer(JNIEnv* e
|
|||||||
SLDataSink audioSnk = {&loc_outmix, NULL};
|
SLDataSink audioSnk = {&loc_outmix, NULL};
|
||||||
|
|
||||||
// create audio player
|
// create audio player
|
||||||
const SLInterfaceID ids[1] = {SL_IID_SEEK};
|
const SLInterfaceID ids[3] = {SL_IID_SEEK, SL_IID_MUTESOLO, SL_IID_VOLUME};
|
||||||
const SLboolean req[1] = {SL_BOOLEAN_TRUE};
|
const SLboolean req[3] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE};
|
||||||
result = (*engineEngine)->CreateAudioPlayer(engineEngine, &uriPlayerObject, &audioSrc,
|
result = (*engineEngine)->CreateAudioPlayer(engineEngine, &uriPlayerObject, &audioSrc,
|
||||||
&audioSnk, 1, ids, req);
|
&audioSnk, 3, ids, req);
|
||||||
// note that an invalid URI is not detected here, but during prepare/prefetch on Android,
|
// note that an invalid URI is not detected here, but during prepare/prefetch on Android,
|
||||||
// or possibly during Realize on other platforms
|
// or possibly during Realize on other platforms
|
||||||
assert(SL_RESULT_SUCCESS == result);
|
assert(SL_RESULT_SUCCESS == result);
|
||||||
@@ -283,8 +301,12 @@ jboolean Java_com_example_nativeaudio_NativeAudio_createUriAudioPlayer(JNIEnv* e
|
|||||||
result = (*uriPlayerObject)->GetInterface(uriPlayerObject, SL_IID_SEEK, &uriPlayerSeek);
|
result = (*uriPlayerObject)->GetInterface(uriPlayerObject, SL_IID_SEEK, &uriPlayerSeek);
|
||||||
assert(SL_RESULT_SUCCESS == result);
|
assert(SL_RESULT_SUCCESS == result);
|
||||||
|
|
||||||
// enable whole file looping
|
// get the mute/solo interface
|
||||||
result = (*uriPlayerSeek)->SetLoop(uriPlayerSeek, SL_BOOLEAN_TRUE, 0, SL_TIME_UNKNOWN);
|
result = (*uriPlayerObject)->GetInterface(uriPlayerObject, SL_IID_MUTESOLO, &uriPlayerMuteSolo);
|
||||||
|
assert(SL_RESULT_SUCCESS == result);
|
||||||
|
|
||||||
|
// get the volume interface
|
||||||
|
result = (*uriPlayerObject)->GetInterface(uriPlayerObject, SL_IID_VOLUME, &uriPlayerVolume);
|
||||||
assert(SL_RESULT_SUCCESS == result);
|
assert(SL_RESULT_SUCCESS == result);
|
||||||
|
|
||||||
return JNI_TRUE;
|
return JNI_TRUE;
|
||||||
@@ -292,6 +314,7 @@ jboolean Java_com_example_nativeaudio_NativeAudio_createUriAudioPlayer(JNIEnv* e
|
|||||||
|
|
||||||
|
|
||||||
// set the playing state for the URI audio player
|
// set the playing state for the URI audio player
|
||||||
|
// to PLAYING (true) or PAUSED (false)
|
||||||
void Java_com_example_nativeaudio_NativeAudio_setPlayingUriAudioPlayer(JNIEnv* env,
|
void Java_com_example_nativeaudio_NativeAudio_setPlayingUriAudioPlayer(JNIEnv* env,
|
||||||
jclass clazz, jboolean isPlaying)
|
jclass clazz, jboolean isPlaying)
|
||||||
{
|
{
|
||||||
@@ -310,6 +333,134 @@ void Java_com_example_nativeaudio_NativeAudio_setPlayingUriAudioPlayer(JNIEnv* e
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// set the whole file looping state for the URI audio player
|
||||||
|
void Java_com_example_nativeaudio_NativeAudio_setLoopingUriAudioPlayer(JNIEnv* env,
|
||||||
|
jclass clazz, jboolean isLooping)
|
||||||
|
{
|
||||||
|
SLresult result;
|
||||||
|
|
||||||
|
// make sure the URI audio player was created
|
||||||
|
if (NULL != uriPlayerSeek) {
|
||||||
|
|
||||||
|
// set the looping state
|
||||||
|
result = (*uriPlayerSeek)->SetLoop(uriPlayerSeek, (SLboolean) isLooping, 0,
|
||||||
|
SL_TIME_UNKNOWN);
|
||||||
|
assert(SL_RESULT_SUCCESS == result);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// expose the mute/solo APIs to Java for one of the 3 players
|
||||||
|
|
||||||
|
static SLMuteSoloItf getMuteSolo()
|
||||||
|
{
|
||||||
|
if (uriPlayerMuteSolo != NULL)
|
||||||
|
return uriPlayerMuteSolo;
|
||||||
|
else if (fdPlayerMuteSolo != NULL)
|
||||||
|
return fdPlayerMuteSolo;
|
||||||
|
else
|
||||||
|
return bqPlayerMuteSolo;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Java_com_example_nativeaudio_NativeAudio_setChannelMuteUriAudioPlayer(JNIEnv* env,
|
||||||
|
jclass clazz, jint chan, jboolean mute)
|
||||||
|
{
|
||||||
|
SLresult result;
|
||||||
|
SLMuteSoloItf muteSoloItf = getMuteSolo();
|
||||||
|
if (NULL != muteSoloItf) {
|
||||||
|
result = (*muteSoloItf)->SetChannelMute(muteSoloItf, chan, mute);
|
||||||
|
assert(SL_RESULT_SUCCESS == result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Java_com_example_nativeaudio_NativeAudio_setChannelSoloUriAudioPlayer(JNIEnv* env,
|
||||||
|
jclass clazz, jint chan, jboolean solo)
|
||||||
|
{
|
||||||
|
SLresult result;
|
||||||
|
SLMuteSoloItf muteSoloItf = getMuteSolo();
|
||||||
|
if (NULL != muteSoloItf) {
|
||||||
|
result = (*muteSoloItf)->SetChannelSolo(muteSoloItf, chan, solo);
|
||||||
|
assert(SL_RESULT_SUCCESS == result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int Java_com_example_nativeaudio_NativeAudio_getNumChannelsUriAudioPlayer(JNIEnv* env, jclass clazz)
|
||||||
|
{
|
||||||
|
SLuint8 numChannels;
|
||||||
|
SLresult result;
|
||||||
|
SLMuteSoloItf muteSoloItf = getMuteSolo();
|
||||||
|
if (NULL != muteSoloItf) {
|
||||||
|
result = (*muteSoloItf)->GetNumChannels(muteSoloItf, &numChannels);
|
||||||
|
if (SL_RESULT_PRECONDITIONS_VIOLATED == result) {
|
||||||
|
// channel count is not yet known
|
||||||
|
numChannels = 0;
|
||||||
|
} else {
|
||||||
|
assert(SL_RESULT_SUCCESS == result);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
numChannels = 0;
|
||||||
|
}
|
||||||
|
return numChannels;
|
||||||
|
}
|
||||||
|
|
||||||
|
// expose the volume APIs to Java for one of the 3 players
|
||||||
|
|
||||||
|
static SLVolumeItf getVolume()
|
||||||
|
{
|
||||||
|
if (uriPlayerVolume != NULL)
|
||||||
|
return uriPlayerVolume;
|
||||||
|
else if (fdPlayerVolume != NULL)
|
||||||
|
return fdPlayerVolume;
|
||||||
|
else
|
||||||
|
return bqPlayerVolume;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Java_com_example_nativeaudio_NativeAudio_setVolumeUriAudioPlayer(JNIEnv* env, jclass clazz,
|
||||||
|
jint millibel)
|
||||||
|
{
|
||||||
|
SLresult result;
|
||||||
|
SLVolumeItf volumeItf = getVolume();
|
||||||
|
if (NULL != volumeItf) {
|
||||||
|
result = (*volumeItf)->SetVolumeLevel(volumeItf, millibel);
|
||||||
|
assert(SL_RESULT_SUCCESS == result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Java_com_example_nativeaudio_NativeAudio_setMuteUriAudioPlayer(JNIEnv* env, jclass clazz,
|
||||||
|
jboolean mute)
|
||||||
|
{
|
||||||
|
SLresult result;
|
||||||
|
SLVolumeItf volumeItf = getVolume();
|
||||||
|
if (NULL != volumeItf) {
|
||||||
|
result = (*volumeItf)->SetMute(volumeItf, mute);
|
||||||
|
assert(SL_RESULT_SUCCESS == result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Java_com_example_nativeaudio_NativeAudio_enableStereoPositionUriAudioPlayer(JNIEnv* env,
|
||||||
|
jclass clazz, jboolean enable)
|
||||||
|
{
|
||||||
|
SLresult result;
|
||||||
|
SLVolumeItf volumeItf = getVolume();
|
||||||
|
if (NULL != volumeItf) {
|
||||||
|
result = (*volumeItf)->EnableStereoPosition(volumeItf, enable);
|
||||||
|
assert(SL_RESULT_SUCCESS == result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Java_com_example_nativeaudio_NativeAudio_setStereoPositionUriAudioPlayer(JNIEnv* env,
|
||||||
|
jclass clazz, jint permille)
|
||||||
|
{
|
||||||
|
SLresult result;
|
||||||
|
SLVolumeItf volumeItf = getVolume();
|
||||||
|
if (NULL != volumeItf) {
|
||||||
|
result = (*volumeItf)->SetStereoPosition(volumeItf, permille);
|
||||||
|
assert(SL_RESULT_SUCCESS == result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// enable reverb on the buffer queue player
|
// enable reverb on the buffer queue player
|
||||||
jboolean Java_com_example_nativeaudio_NativeAudio_enableReverb(JNIEnv* env, jclass clazz,
|
jboolean Java_com_example_nativeaudio_NativeAudio_enableReverb(JNIEnv* env, jclass clazz,
|
||||||
jboolean enabled)
|
jboolean enabled)
|
||||||
@@ -426,10 +577,10 @@ jboolean Java_com_example_nativeaudio_NativeAudio_createAssetAudioPlayer(JNIEnv*
|
|||||||
SLDataSink audioSnk = {&loc_outmix, NULL};
|
SLDataSink audioSnk = {&loc_outmix, NULL};
|
||||||
|
|
||||||
// create audio player
|
// create audio player
|
||||||
const SLInterfaceID ids[1] = {SL_IID_SEEK};
|
const SLInterfaceID ids[3] = {SL_IID_SEEK, SL_IID_MUTESOLO, SL_IID_VOLUME};
|
||||||
const SLboolean req[1] = {SL_BOOLEAN_TRUE};
|
const SLboolean req[3] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE};
|
||||||
result = (*engineEngine)->CreateAudioPlayer(engineEngine, &fdPlayerObject, &audioSrc, &audioSnk,
|
result = (*engineEngine)->CreateAudioPlayer(engineEngine, &fdPlayerObject, &audioSrc, &audioSnk,
|
||||||
1, ids, req);
|
3, ids, req);
|
||||||
assert(SL_RESULT_SUCCESS == result);
|
assert(SL_RESULT_SUCCESS == result);
|
||||||
|
|
||||||
// realize the player
|
// realize the player
|
||||||
@@ -444,6 +595,14 @@ jboolean Java_com_example_nativeaudio_NativeAudio_createAssetAudioPlayer(JNIEnv*
|
|||||||
result = (*fdPlayerObject)->GetInterface(fdPlayerObject, SL_IID_SEEK, &fdPlayerSeek);
|
result = (*fdPlayerObject)->GetInterface(fdPlayerObject, SL_IID_SEEK, &fdPlayerSeek);
|
||||||
assert(SL_RESULT_SUCCESS == result);
|
assert(SL_RESULT_SUCCESS == result);
|
||||||
|
|
||||||
|
// get the mute/solo interface
|
||||||
|
result = (*fdPlayerObject)->GetInterface(fdPlayerObject, SL_IID_MUTESOLO, &fdPlayerMuteSolo);
|
||||||
|
assert(SL_RESULT_SUCCESS == result);
|
||||||
|
|
||||||
|
// get the volume interface
|
||||||
|
result = (*fdPlayerObject)->GetInterface(fdPlayerObject, SL_IID_VOLUME, &fdPlayerVolume);
|
||||||
|
assert(SL_RESULT_SUCCESS == result);
|
||||||
|
|
||||||
// enable whole file looping
|
// enable whole file looping
|
||||||
result = (*fdPlayerSeek)->SetLoop(fdPlayerSeek, SL_BOOLEAN_TRUE, 0, SL_TIME_UNKNOWN);
|
result = (*fdPlayerSeek)->SetLoop(fdPlayerSeek, SL_BOOLEAN_TRUE, 0, SL_TIME_UNKNOWN);
|
||||||
assert(SL_RESULT_SUCCESS == result);
|
assert(SL_RESULT_SUCCESS == result);
|
||||||
@@ -562,6 +721,8 @@ void Java_com_example_nativeaudio_NativeAudio_shutdown(JNIEnv* env, jclass clazz
|
|||||||
bqPlayerPlay = NULL;
|
bqPlayerPlay = NULL;
|
||||||
bqPlayerBufferQueue = NULL;
|
bqPlayerBufferQueue = NULL;
|
||||||
bqPlayerEffectSend = NULL;
|
bqPlayerEffectSend = NULL;
|
||||||
|
bqPlayerMuteSolo = NULL;
|
||||||
|
bqPlayerVolume = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// destroy file descriptor audio player object, and invalidate all associated interfaces
|
// destroy file descriptor audio player object, and invalidate all associated interfaces
|
||||||
@@ -570,6 +731,8 @@ void Java_com_example_nativeaudio_NativeAudio_shutdown(JNIEnv* env, jclass clazz
|
|||||||
fdPlayerObject = NULL;
|
fdPlayerObject = NULL;
|
||||||
fdPlayerPlay = NULL;
|
fdPlayerPlay = NULL;
|
||||||
fdPlayerSeek = NULL;
|
fdPlayerSeek = NULL;
|
||||||
|
fdPlayerMuteSolo = NULL;
|
||||||
|
fdPlayerVolume = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// destroy URI audio player object, and invalidate all associated interfaces
|
// destroy URI audio player object, and invalidate all associated interfaces
|
||||||
@@ -578,6 +741,8 @@ void Java_com_example_nativeaudio_NativeAudio_shutdown(JNIEnv* env, jclass clazz
|
|||||||
uriPlayerObject = NULL;
|
uriPlayerObject = NULL;
|
||||||
uriPlayerPlay = NULL;
|
uriPlayerPlay = NULL;
|
||||||
uriPlayerSeek = NULL;
|
uriPlayerSeek = NULL;
|
||||||
|
uriPlayerMuteSolo = NULL;
|
||||||
|
uriPlayerVolume = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// destroy audio recorder object, and invalidate all associated interfaces
|
// destroy audio recorder object, and invalidate all associated interfaces
|
||||||
|
|||||||
@@ -26,6 +26,11 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="@string/hello"
|
android:text="@string/hello"
|
||||||
/>
|
/>
|
||||||
|
<LinearLayout
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
>
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/hello"
|
android:id="@+id/hello"
|
||||||
android:text="Hello"
|
android:text="Hello"
|
||||||
@@ -44,6 +49,18 @@
|
|||||||
android:layout_width="fill_parent"
|
android:layout_width="fill_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
/>
|
/>
|
||||||
|
<Button
|
||||||
|
android:id="@+id/embedded_soundtrack"
|
||||||
|
android:text="Embedded\nsoundtrack"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
/>
|
||||||
|
</LinearLayout>
|
||||||
|
<LinearLayout
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
>
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/reverb"
|
android:id="@+id/reverb"
|
||||||
android:text="Reverb"
|
android:text="Reverb"
|
||||||
@@ -51,14 +68,105 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
/>
|
/>
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/embedded_soundtrack"
|
android:id="@+id/mute_uri"
|
||||||
android:text="Embedded soundtrack"
|
android:text="Mute"
|
||||||
android:layout_width="fill_parent"
|
android:layout_width="fill_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
/>
|
/>
|
||||||
|
<Button
|
||||||
|
android:id="@+id/enable_stereo_position_uri"
|
||||||
|
android:text="Enable SP"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
/>
|
||||||
|
</LinearLayout>
|
||||||
|
<LinearLayout
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
>
|
||||||
|
<Spinner
|
||||||
|
android:id="@+id/uri_spinner"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="URI spinner"
|
||||||
|
/>
|
||||||
|
</LinearLayout>
|
||||||
|
<LinearLayout
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
>
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/uri_soundtrack"
|
android:id="@+id/uri_soundtrack"
|
||||||
android:text="URI soundtrack"
|
android:text="URI\nsoundtrack"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
android:id="@+id/pause_uri"
|
||||||
|
android:text="Pause\nURI"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
android:id="@+id/play_uri"
|
||||||
|
android:text="Play\nURI"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
android:id="@+id/loop_uri"
|
||||||
|
android:text="Loop\nURI"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
/>
|
||||||
|
</LinearLayout>
|
||||||
|
<LinearLayout
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
>
|
||||||
|
<Button
|
||||||
|
android:id="@+id/mute_left_uri"
|
||||||
|
android:text="mute left"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
android:id="@+id/mute_right_uri"
|
||||||
|
android:text="mute right"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
android:id="@+id/solo_left_uri"
|
||||||
|
android:text="solo left"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
android:id="@+id/solo_right_uri"
|
||||||
|
android:text="solo right"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
/>
|
||||||
|
</LinearLayout>
|
||||||
|
<Button
|
||||||
|
android:id="@+id/channels_uri"
|
||||||
|
android:text="Get channels"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
/>
|
||||||
|
<SeekBar
|
||||||
|
android:id="@+id/volume_uri"
|
||||||
|
android:text="Volume"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
/>
|
||||||
|
<SeekBar
|
||||||
|
android:id="@+id/pan_uri"
|
||||||
|
android:text="Pan"
|
||||||
android:layout_width="fill_parent"
|
android:layout_width="fill_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -19,4 +19,10 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="hello">Hello, Android using native audio!</string>
|
<string name="hello">Hello, Android using native audio!</string>
|
||||||
<string name="app_name">NativeAudio</string>
|
<string name="app_name">NativeAudio</string>
|
||||||
|
|
||||||
|
<string-array name="uri_spinner_array">
|
||||||
|
<item>http://upload.wikimedia.org/wikipedia/commons/6/6d/Banana.ogg</item>
|
||||||
|
<item>http://www.freesound.org/data/previews/18/18765_18799-lq.mp3</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -19,24 +19,35 @@ package com.example.nativeaudio;
|
|||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.res.AssetManager;
|
import android.content.res.AssetManager;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
//import android.util.Log;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.View.OnClickListener;
|
import android.view.View.OnClickListener;
|
||||||
|
import android.widget.AdapterView;
|
||||||
|
import android.widget.ArrayAdapter;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
|
import android.widget.SeekBar;
|
||||||
|
import android.widget.SeekBar.OnSeekBarChangeListener;
|
||||||
|
import android.widget.Spinner;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
public class NativeAudio extends Activity {
|
public class NativeAudio extends Activity {
|
||||||
|
|
||||||
|
//static final String TAG = "NativeAudio";
|
||||||
|
|
||||||
static final int CLIP_NONE = 0;
|
static final int CLIP_NONE = 0;
|
||||||
static final int CLIP_HELLO = 1;
|
static final int CLIP_HELLO = 1;
|
||||||
static final int CLIP_ANDROID = 2;
|
static final int CLIP_ANDROID = 2;
|
||||||
static final int CLIP_SAWTOOTH = 3;
|
static final int CLIP_SAWTOOTH = 3;
|
||||||
static final int CLIP_PLAYBACK = 4;
|
static final int CLIP_PLAYBACK = 4;
|
||||||
|
|
||||||
static final String URI = "http://upload.wikimedia.org/wikipedia/commons/6/6d/Banana.ogg";
|
static String URI;
|
||||||
static AssetManager assetManager;
|
static AssetManager assetManager;
|
||||||
|
|
||||||
static boolean isPlayingAsset = false;
|
static boolean isPlayingAsset = false;
|
||||||
static boolean isPlayingUri = false;
|
static boolean isPlayingUri = false;
|
||||||
|
|
||||||
|
static int numChannelsUri = 0;
|
||||||
|
|
||||||
/** Called when the activity is first created. */
|
/** Called when the activity is first created. */
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle icicle) {
|
protected void onCreate(Bundle icicle) {
|
||||||
@@ -50,6 +61,24 @@ public class NativeAudio extends Activity {
|
|||||||
createEngine();
|
createEngine();
|
||||||
createBufferQueueAudioPlayer();
|
createBufferQueueAudioPlayer();
|
||||||
|
|
||||||
|
// initialize URI spinner
|
||||||
|
Spinner uriSpinner = (Spinner) findViewById(R.id.uri_spinner);
|
||||||
|
ArrayAdapter<CharSequence> uriAdapter = ArrayAdapter.createFromResource(
|
||||||
|
this, R.array.uri_spinner_array, android.R.layout.simple_spinner_item);
|
||||||
|
uriAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
||||||
|
uriSpinner.setAdapter(uriAdapter);
|
||||||
|
uriSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
|
||||||
|
|
||||||
|
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
|
||||||
|
URI = parent.getItemAtPosition(pos).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onNothingSelected(AdapterView parent) {
|
||||||
|
URI = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
// initialize button click handlers
|
// initialize button click handlers
|
||||||
|
|
||||||
((Button) findViewById(R.id.hello)).setOnClickListener(new OnClickListener() {
|
((Button) findViewById(R.id.hello)).setOnClickListener(new OnClickListener() {
|
||||||
@@ -99,16 +128,122 @@ public class NativeAudio extends Activity {
|
|||||||
((Button) findViewById(R.id.uri_soundtrack)).setOnClickListener(new OnClickListener() {
|
((Button) findViewById(R.id.uri_soundtrack)).setOnClickListener(new OnClickListener() {
|
||||||
boolean created = false;
|
boolean created = false;
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
if (!created) {
|
if (!created && URI != null) {
|
||||||
created = createUriAudioPlayer(URI);
|
created = createUriAudioPlayer(URI);
|
||||||
}
|
}
|
||||||
if (created) {
|
|
||||||
isPlayingUri = !isPlayingUri;
|
|
||||||
setPlayingUriAudioPlayer(isPlayingUri);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
((Button) findViewById(R.id.pause_uri)).setOnClickListener(new OnClickListener() {
|
||||||
|
public void onClick(View view) {
|
||||||
|
setPlayingUriAudioPlayer(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
((Button) findViewById(R.id.play_uri)).setOnClickListener(new OnClickListener() {
|
||||||
|
public void onClick(View view) {
|
||||||
|
setPlayingUriAudioPlayer(true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
((Button) findViewById(R.id.loop_uri)).setOnClickListener(new OnClickListener() {
|
||||||
|
boolean isLooping = false;
|
||||||
|
public void onClick(View view) {
|
||||||
|
isLooping = !isLooping;
|
||||||
|
setLoopingUriAudioPlayer(isLooping);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
((Button) findViewById(R.id.mute_left_uri)).setOnClickListener(new OnClickListener() {
|
||||||
|
boolean muted = false;
|
||||||
|
public void onClick(View view) {
|
||||||
|
muted = !muted;
|
||||||
|
setChannelMuteUriAudioPlayer(0, muted);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
((Button) findViewById(R.id.mute_right_uri)).setOnClickListener(new OnClickListener() {
|
||||||
|
boolean muted = false;
|
||||||
|
public void onClick(View view) {
|
||||||
|
muted = !muted;
|
||||||
|
setChannelMuteUriAudioPlayer(1, muted);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
((Button) findViewById(R.id.solo_left_uri)).setOnClickListener(new OnClickListener() {
|
||||||
|
boolean soloed = false;
|
||||||
|
public void onClick(View view) {
|
||||||
|
soloed = !soloed;
|
||||||
|
setChannelSoloUriAudioPlayer(0, soloed);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
((Button) findViewById(R.id.solo_right_uri)).setOnClickListener(new OnClickListener() {
|
||||||
|
boolean soloed = false;
|
||||||
|
public void onClick(View view) {
|
||||||
|
soloed = !soloed;
|
||||||
|
setChannelSoloUriAudioPlayer(1, soloed);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
((Button) findViewById(R.id.mute_uri)).setOnClickListener(new OnClickListener() {
|
||||||
|
boolean muted = false;
|
||||||
|
public void onClick(View view) {
|
||||||
|
muted = !muted;
|
||||||
|
setMuteUriAudioPlayer(muted);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
((Button) findViewById(R.id.enable_stereo_position_uri)).setOnClickListener(
|
||||||
|
new OnClickListener() {
|
||||||
|
boolean enabled = false;
|
||||||
|
public void onClick(View view) {
|
||||||
|
enabled = !enabled;
|
||||||
|
enableStereoPositionUriAudioPlayer(enabled);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
((Button) findViewById(R.id.channels_uri)).setOnClickListener(new OnClickListener() {
|
||||||
|
public void onClick(View view) {
|
||||||
|
if (numChannelsUri == 0) {
|
||||||
|
numChannelsUri = getNumChannelsUriAudioPlayer();
|
||||||
|
}
|
||||||
|
Toast.makeText(NativeAudio.this, "Channels: " + numChannelsUri,
|
||||||
|
Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
((SeekBar) findViewById(R.id.volume_uri)).setOnSeekBarChangeListener(
|
||||||
|
new OnSeekBarChangeListener() {
|
||||||
|
int lastProgress = 100;
|
||||||
|
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
|
||||||
|
assert progress >= 0 && progress <= 100;
|
||||||
|
lastProgress = progress;
|
||||||
|
}
|
||||||
|
public void onStartTrackingTouch(SeekBar seekBar) {
|
||||||
|
}
|
||||||
|
public void onStopTrackingTouch(SeekBar seekBar) {
|
||||||
|
int attenuation = 100 - lastProgress;
|
||||||
|
int millibel = attenuation * -50;
|
||||||
|
setVolumeUriAudioPlayer(millibel);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
((SeekBar) findViewById(R.id.pan_uri)).setOnSeekBarChangeListener(
|
||||||
|
new OnSeekBarChangeListener() {
|
||||||
|
int lastProgress = 100;
|
||||||
|
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
|
||||||
|
assert progress >= 0 && progress <= 100;
|
||||||
|
lastProgress = progress;
|
||||||
|
}
|
||||||
|
public void onStartTrackingTouch(SeekBar seekBar) {
|
||||||
|
}
|
||||||
|
public void onStopTrackingTouch(SeekBar seekBar) {
|
||||||
|
int permille = (lastProgress - 50) * 20;
|
||||||
|
setStereoPositionUriAudioPlayer(permille);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
((Button) findViewById(R.id.record)).setOnClickListener(new OnClickListener() {
|
((Button) findViewById(R.id.record)).setOnClickListener(new OnClickListener() {
|
||||||
boolean created = false;
|
boolean created = false;
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
@@ -155,9 +290,18 @@ public class NativeAudio extends Activity {
|
|||||||
public static native void createEngine();
|
public static native void createEngine();
|
||||||
public static native void createBufferQueueAudioPlayer();
|
public static native void createBufferQueueAudioPlayer();
|
||||||
public static native boolean createAssetAudioPlayer(AssetManager assetManager, String filename);
|
public static native boolean createAssetAudioPlayer(AssetManager assetManager, String filename);
|
||||||
|
// true == PLAYING, false == PAUSED
|
||||||
public static native void setPlayingAssetAudioPlayer(boolean isPlaying);
|
public static native void setPlayingAssetAudioPlayer(boolean isPlaying);
|
||||||
public static native boolean createUriAudioPlayer(String uri);
|
public static native boolean createUriAudioPlayer(String uri);
|
||||||
public static native void setPlayingUriAudioPlayer(boolean isPlaying);
|
public static native void setPlayingUriAudioPlayer(boolean isPlaying);
|
||||||
|
public static native void setLoopingUriAudioPlayer(boolean isLooping);
|
||||||
|
public static native void setChannelMuteUriAudioPlayer(int chan, boolean mute);
|
||||||
|
public static native void setChannelSoloUriAudioPlayer(int chan, boolean solo);
|
||||||
|
public static native int getNumChannelsUriAudioPlayer();
|
||||||
|
public static native void setVolumeUriAudioPlayer(int millibel);
|
||||||
|
public static native void setMuteUriAudioPlayer(boolean mute);
|
||||||
|
public static native void enableStereoPositionUriAudioPlayer(boolean enable);
|
||||||
|
public static native void setStereoPositionUriAudioPlayer(int permille);
|
||||||
public static native boolean selectClip(int which, int count);
|
public static native boolean selectClip(int which, int count);
|
||||||
public static native boolean enableReverb(boolean enabled);
|
public static native boolean enableReverb(boolean enabled);
|
||||||
public static native boolean createAudioRecorder();
|
public static native boolean createAudioRecorder();
|
||||||
|
|||||||
Reference in New Issue
Block a user