From c5e869ce4df4a371e3f32a1055bfc7e211019519 Mon Sep 17 00:00:00 2001 From: Jaechul Lee Date: Wed, 20 Apr 2022 20:06:10 +0900 Subject: [PATCH] audio_io_test: Release device list device list after using it * fixed memory leak * save a pair of dump files [Version] 0.5.50 [Issue Type] Bug Change-Id: Iece406d6fe21634eb0bda526f35e7d67bd95525d Signed-off-by: Jaechul Lee --- packaging/capi-media-audio-io.spec | 2 +- test/audio_io_test.c | 132 ++++++++++++++++++++++++------------- 2 files changed, 89 insertions(+), 45 deletions(-) diff --git a/packaging/capi-media-audio-io.spec b/packaging/capi-media-audio-io.spec index 4381a96..a030221 100644 --- a/packaging/capi-media-audio-io.spec +++ b/packaging/capi-media-audio-io.spec @@ -1,6 +1,6 @@ Name: capi-media-audio-io Summary: An Audio Input & Audio Output library in Tizen Native API -Version: 0.5.49 +Version: 0.5.50 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/test/audio_io_test.c b/test/audio_io_test.c index 3b77d22..2175b06 100644 --- a/test/audio_io_test.c +++ b/test/audio_io_test.c @@ -30,11 +30,20 @@ #endif #define TABLE_SIZE (200) + typedef struct { float sine[TABLE_SIZE]; int left_channel; int right_channel; } test_wav_t; + +typedef struct { + char filename[FILENAME_MAX]; + int rate; + int channels; + int ref_deviceid; +} test_echo_cancel_t; + test_wav_t test_wav; static int ch_table[] = { 0, AUDIO_CHANNEL_MONO, AUDIO_CHANNEL_STEREO, @@ -257,44 +266,25 @@ EXIT: printf("Play done\n"); } -static sound_device_h *find_device_by_id(int id) -{ - sound_device_list_h device_list; - sound_device_h device; - int _id; - - if (sound_manager_get_device_list(SOUND_DEVICE_ALL_MASK, &device_list) != 0) - return NULL; - - while (!sound_manager_get_next_device(device_list, &device)) { - if (sound_manager_get_device_id(device, &_id) != 0) { - device = NULL; - goto out; - } - - if (_id == id) - break; - } - -out: - sound_manager_free_device_list(device_list); - - return device; -} - -static int _record_echocancel(char *filename, int rate, int channels, int ref_deviceid) +static void *_record_echo_cancel_thread(void *userdata) { int ret, size; sound_stream_info_h stream_info; - sound_device_h ref_dev = NULL; audio_in_h input = NULL; FILE *fp = NULL; char *buffer = NULL; - ret = audio_in_create(rate, ch_table[channels], AUDIO_SAMPLE_TYPE_S16_LE, &input); + sound_device_list_h device_list = NULL; + sound_device_h device; + bool found = false; + int id; + + test_echo_cancel_t *data = (test_echo_cancel_t *)userdata; + + ret = audio_in_create(data->rate, ch_table[data->channels], AUDIO_SAMPLE_TYPE_S16_LE, &input); if (ret != AUDIO_IO_ERROR_NONE) { printf("audio in create error = 0x%x\n", ret); - return -1; + goto out; } ret = sound_manager_create_stream_information(SOUND_STREAM_TYPE_MEDIA, NULL, NULL, &stream_info); @@ -303,19 +293,36 @@ static int _record_echocancel(char *filename, int rate, int channels, int ref_de goto out; } - if (!(ref_dev = find_device_by_id(ref_deviceid))) { - printf("fail to get ref device id\b"); + if (sound_manager_get_device_list(SOUND_DEVICE_ALL_MASK, &device_list) != SOUND_MANAGER_ERROR_NONE) { + printf("fail to get device list"); goto out; } - ret = sound_manager_set_echo_cancel_reference_device(stream_info, ref_dev); - if (ret) { - printf("fail to sound_manager_set_echo_cancel_reference_device(), ret(0x%x)\n", ret); - goto out; + if (data->ref_deviceid != SOUND_MANAGER_STREAM_NO_REFERENCE_DEVICE) { + while (sound_manager_get_next_device(device_list, &device) == SOUND_MANAGER_ERROR_NONE) { + if (sound_manager_get_device_id(device, &id) != SOUND_MANAGER_ERROR_NONE) + goto out; + + if (data->ref_deviceid == id) { + found = true; + break; + } + } + + if (!found) { + printf("Failed to find reference device"); + goto out; + } + + ret = sound_manager_set_echo_cancel_reference_device(stream_info, device); + if (ret != SOUND_MANAGER_ERROR_NONE) { + printf("fail to sound_manager_set_echo_cancel_reference_device(), ret(0x%x)\n", ret); + goto out; + } } ret = audio_in_set_sound_stream_info(input, stream_info); - if (ret) { + if (ret != AUDIO_IO_ERROR_NONE) { printf("fail to audio_in_set_sound_stream_info(), ret(0x%x)\n", ret); goto out; } @@ -332,7 +339,7 @@ static int _record_echocancel(char *filename, int rate, int channels, int ref_de goto out; } - fp = fopen(filename, "wb+"); + fp = fopen(data->filename, "wb+"); if (fp == NULL) { printf("ERROR, file open failed\n"); goto out; @@ -351,11 +358,48 @@ static int _record_echocancel(char *filename, int rate, int channels, int ref_de } out: - fclose(fp); - audio_in_unprepare(input); - audio_in_destroy(input); + if (fp) + fclose(fp); - return 0; + if (input) { + audio_in_unprepare(input); + audio_in_destroy(input); + } + + if (device_list) + sound_manager_free_device_list(device_list); + + pthread_exit(0); + + return NULL; +} + +static void _test_echo_cancel(const char *filename, int rate, int channels, int ref_deviceid, bool capture) +{ + int status; + pthread_t thread_echo_cancel; + test_echo_cancel_t data; + + snprintf(data.filename, FILENAME_MAX, "%s", filename); + data.rate = rate; + data.channels = channels; + data.ref_deviceid = ref_deviceid; + pthread_create(&thread_echo_cancel, NULL, _record_echo_cancel_thread, &data); + + if (capture) { + pthread_t thread_capture; + test_echo_cancel_t data_capture; + + snprintf(data_capture.filename, FILENAME_MAX, "%s_%s", filename, "norm"); + data_capture.rate = rate; + data_capture.channels = channels; + data_capture.ref_deviceid = SOUND_MANAGER_STREAM_NO_REFERENCE_DEVICE; + + pthread_create(&thread_capture, NULL, _record_echo_cancel_thread, &data_capture); + pthread_join(thread_capture, (void**)&status); + } + + pthread_join(thread_echo_cancel, (void**)&status); } static int _record_and_play(int length, int num, int ch) @@ -1150,8 +1194,8 @@ int main(int argc, char **argv) _play_file_sample_sync(argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5])); else if (strcmp(argv[1], "playasync") == 0) _play_file_sample_async(argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5])); - else if (strcmp(argv[1], "echocancel") == 0) - _record_echocancel(argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5])); + } else if (argc == 7 && strcmp(argv[1], "echocancel") == 0) { + _test_echo_cancel(argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), !!atoi(argv[6])); } else { printf("- Usages :\n"); printf("- # audio_io_test loopback\n"); @@ -1160,7 +1204,7 @@ int main(int argc, char **argv) printf("- # audio_io_test async [write(1) | read(2)]\n"); printf("- # audio_io_test play [filename] [sample rate] [channels] [type(0:U8,1:S16LE,2:S24LE,3:S24_32LE)]\n"); printf("- # audio_io_test playasync [filename] [sample rate] [channels] [type(0:U8,1:S16LE,2:S24LE,3:S24_32LE)]\n"); - printf("- # audio_io_test echocancel [filename] [sample rate] [channels] [ref_dev]\n"); + printf("- # audio_io_test echocancel [filename] [sample rate] [channels] [ref_dev] [capture without EC]\n"); } return 0; } -- 2.7.4