audio_io_test: Release device list device list after using it
[platform/core/api/audio-io.git] / test / audio_io_test.c
index 3b77d22..2175b06 100644 (file)
 #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;
 }