release when finish playing

dev
xufulong 4 years ago
parent 658be6c733
commit dff47a5a5c
  1. 7
      app/src/main/cpp/audio_player.cpp
  2. 45
      app/src/main/cpp/visualizer/execute_fft.c
  3. 10
      app/src/main/cpp/visualizer/execute_fft.h

@ -286,10 +286,9 @@ AUDIO_PLAYER_FUNC(void, play, jstring input_jstr, jstring filter_jstr) {
jmethodID fft_method = env->GetMethodID(player_class, "fftCallbackFromJNI", "([S)V");
filter_sys_t *fft_filter = static_cast<filter_sys_t *>(malloc(sizeof(filter_sys_t)));
open_visualizer(fft_filter);
init_visualizer(fft_filter);
auto *block = static_cast<block_t *>(malloc(sizeof(block_t)));
block->i_nb_samples = 0;
// block->fft_callback.callback = fft_callback;
int16_t *output = static_cast<int16_t *>(malloc(FFT_BUFFER_SIZE * sizeof(int16_t)));
//read audio frame
@ -317,10 +316,8 @@ AUDIO_PLAYER_FUNC(void, play, jstring input_jstr, jstring filter_jstr) {
auto *data = static_cast<uint8_t *>(malloc(frame->nb_samples * sizeof(uint8_t)));
block->p_buffer = data;
block->i_nb_samples = static_cast<unsigned int>(frame->nb_samples);
LOGE(TAG, "frame->nb_samples=%d", frame->nb_samples);
}
if (block->i_nb_samples == frame->nb_samples) {
LOGE(TAG, "start frame->nb_samples=%d", frame->nb_samples);
memcpy(block->p_buffer, frame->data[0], static_cast<size_t>(frame->nb_samples));
fft_once(fft_filter, block, output);
fft_callback(env, thiz, fft_method, output);
@ -373,6 +370,7 @@ end:
env->CallVoidMethod(thiz, releaseMethod);
filter_again = 0;
filter_release = 0;
release_visualizer(fft_filter);
LOGE(TAG, "audio release...");
}
@ -387,7 +385,6 @@ AUDIO_PLAYER_FUNC(void, release) {
}
void fft_callback(JNIEnv *jniEnv, jobject thiz, jmethodID fft_method, int16_t * arg) {
LOGE(TAG, "arg[100]=%d,arg[101]=%d,arg[102]=%d", arg[100], arg[101], arg[102]);
jshortArray dataArray = jniEnv->NewShortArray(256);
jniEnv->SetShortArrayRegion(dataArray, 0, 256, arg);
jniEnv->CallVoidMethod(thiz, fft_method, dataArray);

@ -13,7 +13,7 @@
#define ROTATION_INCREMENT .1f
#define BAR_DECREMENT .075f
/*static*/ int open_visualizer(filter_sys_t *p_sys)
int open_visualizer(filter_sys_t *p_sys)
{
if (p_sys == NULL)
return VLC_ENOMEM;
@ -33,29 +33,30 @@
window_get_param(&p_sys->wind_param);
/* Create the FIFO for the audio data. */
// vlc_queue_t *queue = vlc_queue_init(5);
// p_sys->queue = *queue;
// p_sys->dead = false;
vlc_queue_t *queue = vlc_queue_init(5);
p_sys->queue = *queue;
p_sys->dead = false;
// pthread_create (&p_sys->thread, NULL, fft_thread, p_sys);//TODO
pthread_create (&p_sys->thread, NULL, fft_thread, p_sys);//TODO
return VLC_SUCCESS;
}
/*static*/ block_t *filter_audio(filter_sys_t *p_sys, void *p_in_buf)
block_t *filter_audio(filter_sys_t *p_sys, void *p_in_buf)
{
return vlc_queue_push(&p_sys->queue, p_in_buf);
}
/*static*/ void close_visualizer(filter_sys_t *p_filter)
void close_visualizer(filter_sys_t *p_filter)
{
filter_sys_t *p_sys = p_filter;
/* Terminate the thread. */
vlc_queue_free(&p_sys->queue);
pthread_join(p_sys->thread, NULL);
free(p_sys->p_prev_s16_buff);
free(&p_sys->wind_param);
free(p_sys);
}
static void *fft_thread(void *p_data)
@ -179,6 +180,34 @@ release:
return NULL;
}
int init_visualizer(filter_sys_t *p_sys)
{
if (p_sys == NULL)
return -1;
/* Create the object for the thread */
p_sys->i_channels = 1;
p_sys->i_prev_nb_samples = 0;
p_sys->p_prev_s16_buff = NULL;
window_param *w_param = (window_param*) malloc(sizeof(window_param));
p_sys->wind_param = *w_param;
/* Fetch the FFT window parameters */
window_get_param(&p_sys->wind_param);
return 0;
}
void release_visualizer(filter_sys_t *p_filter)
{
filter_sys_t *p_sys = p_filter;
free(p_sys->p_prev_s16_buff);
free(&p_sys->wind_param);
free(p_sys);
}
void fft_once(void *p_data, block_t *block, int16_t *output)
{
filter_sys_t *p_sys = (filter_sys_t*)p_data;

@ -39,12 +39,16 @@ typedef struct
static void *fft_thread(void *);
/*static*/ int open_visualizer(filter_sys_t *p_sys);
int open_visualizer(filter_sys_t *p_sys);
/*static*/ block_t *filter_audio(filter_sys_t *p_sys, void *p_in_buf);
block_t *filter_audio(filter_sys_t *p_sys, void *p_in_buf);
/*static*/ void close_visualizer(filter_sys_t *p_filter);
void close_visualizer(filter_sys_t *p_filter);
void fft_once(void *p_data, block_t *block, int16_t *output);
int init_visualizer(filter_sys_t *p_sys);
void release_visualizer(filter_sys_t *p_sys);
#endif //PLAYER_CORE_RUN_FFT_H

Loading…
Cancel
Save