| @@ -28,6 +28,7 @@ | |||||
| STATICMETHOD (getMinBufferSize, "getMinBufferSize", "(III)I") \ | STATICMETHOD (getMinBufferSize, "getMinBufferSize", "(III)I") \ | ||||
| STATICMETHOD (getNativeOutputSampleRate, "getNativeOutputSampleRate", "(I)I") \ | STATICMETHOD (getNativeOutputSampleRate, "getNativeOutputSampleRate", "(I)I") \ | ||||
| METHOD (constructor, "<init>", "(IIIIII)V") \ | METHOD (constructor, "<init>", "(IIIIII)V") \ | ||||
| METHOD (getState, "getState", "()I") \ | |||||
| METHOD (play, "play", "()V") \ | METHOD (play, "play", "()V") \ | ||||
| METHOD (stop, "stop", "()V") \ | METHOD (stop, "stop", "()V") \ | ||||
| METHOD (release, "release", "()V") \ | METHOD (release, "release", "()V") \ | ||||
| @@ -40,22 +41,27 @@ DECLARE_JNI_CLASS (AudioTrack, "android/media/AudioTrack"); | |||||
| //============================================================================== | //============================================================================== | ||||
| #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \ | #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \ | ||||
| STATICMETHOD (getMinBufferSize, "getMinBufferSize", "(III)I") \ | STATICMETHOD (getMinBufferSize, "getMinBufferSize", "(III)I") \ | ||||
| METHOD (constructor, "<init>", "(IIIII)V"); \ | |||||
| METHOD (startRecording, "startRecording", "()V"); \ | |||||
| METHOD (stop, "stop", "()V"); \ | |||||
| METHOD (read, "read", "([SII)I"); \ | |||||
| METHOD (release, "release", "()V"); \ | |||||
| METHOD (constructor, "<init>", "(IIIII)V") \ | |||||
| METHOD (getState, "getState", "()I") \ | |||||
| METHOD (startRecording, "startRecording", "()V") \ | |||||
| METHOD (stop, "stop", "()V") \ | |||||
| METHOD (read, "read", "([SII)I") \ | |||||
| METHOD (release, "release", "()V") \ | |||||
| DECLARE_JNI_CLASS (AudioRecord, "android/media/AudioRecord"); | DECLARE_JNI_CLASS (AudioRecord, "android/media/AudioRecord"); | ||||
| #undef JNI_CLASS_MEMBERS | #undef JNI_CLASS_MEMBERS | ||||
| //============================================================================== | //============================================================================== | ||||
| #define CHANNEL_OUT_STEREO ((jint) 12) | |||||
| #define CHANNEL_IN_STEREO ((jint) 12) | |||||
| #define CHANNEL_IN_MONO ((jint) 16) | |||||
| #define ENCODING_PCM_16BIT ((jint) 2) | |||||
| #define STREAM_MUSIC ((jint) 3) | |||||
| #define MODE_STREAM ((jint) 1) | |||||
| enum | |||||
| { | |||||
| CHANNEL_OUT_STEREO = 12, | |||||
| CHANNEL_IN_STEREO = 12, | |||||
| CHANNEL_IN_MONO = 16, | |||||
| ENCODING_PCM_16BIT = 2, | |||||
| STREAM_MUSIC = 3, | |||||
| MODE_STREAM = 1, | |||||
| STATE_UNINITIALIZED = 0 | |||||
| }; | |||||
| //============================================================================== | //============================================================================== | ||||
| class AndroidAudioIODevice : public AudioIODevice, | class AndroidAudioIODevice : public AudioIODevice, | ||||
| @@ -171,7 +177,11 @@ public: | |||||
| outputDevice = GlobalRef (env->NewObject (AudioTrack, AudioTrack.constructor, | outputDevice = GlobalRef (env->NewObject (AudioTrack, AudioTrack.constructor, | ||||
| STREAM_MUSIC, sampleRate, CHANNEL_OUT_STEREO, ENCODING_PCM_16BIT, | STREAM_MUSIC, sampleRate, CHANNEL_OUT_STEREO, ENCODING_PCM_16BIT, | ||||
| (jint) (actualBufferSize * numDeviceOutputChannels * sizeof (float)), MODE_STREAM)); | (jint) (actualBufferSize * numDeviceOutputChannels * sizeof (float)), MODE_STREAM)); | ||||
| isRunning = true; | |||||
| if (env->CallIntMethod (outputDevice, AudioTrack.getState) != STATE_UNINITIALIZED) | |||||
| isRunning = true; | |||||
| else | |||||
| outputDevice.clear(); // failed to open the device | |||||
| } | } | ||||
| if (numClientInputChannels > 0 && numDeviceInputChannelsAvailable > 0) | if (numClientInputChannels > 0 && numDeviceInputChannelsAvailable > 0) | ||||
| @@ -182,7 +192,11 @@ public: | |||||
| numDeviceInputChannelsAvailable > 1 ? CHANNEL_IN_STEREO : CHANNEL_IN_MONO, | numDeviceInputChannelsAvailable > 1 ? CHANNEL_IN_STEREO : CHANNEL_IN_MONO, | ||||
| ENCODING_PCM_16BIT, | ENCODING_PCM_16BIT, | ||||
| (jint) (actualBufferSize * numDeviceInputChannels * sizeof (float)))); | (jint) (actualBufferSize * numDeviceInputChannels * sizeof (float)))); | ||||
| isRunning = true; | |||||
| if (env->CallIntMethod (inputDevice, AudioRecord.getState) != STATE_UNINITIALIZED) | |||||
| isRunning = true; | |||||
| else | |||||
| inputDevice.clear(); // failed to open the device | |||||
| } | } | ||||
| if (isRunning) | if (isRunning) | ||||