-static void *_record_echo_cancel_thread(void *userdata)
-{
- int ret, size;
- sound_stream_info_h stream_info;
- audio_in_h input = NULL;
- FILE *fp = NULL;
- char *buffer = NULL;
-
- 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);
- goto out;
- }
-
- ret = sound_manager_create_stream_information(SOUND_STREAM_TYPE_MEDIA, NULL, NULL, &stream_info);
- if (ret) {
- printf("fail to sound_manager_create_stream_information(), ret(0x%x)\n", ret);
- goto out;
- }
-
- if (sound_manager_get_device_list(SOUND_DEVICE_ALL_MASK, &device_list) != SOUND_MANAGER_ERROR_NONE) {
- printf("fail to get device list");
- 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, SOUND_ACOUSTIC_ECHO_CANCEL_VOICE_CALL);
- 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 != AUDIO_IO_ERROR_NONE) {
- printf("fail to audio_in_set_sound_stream_info(), ret(0x%x)\n", ret);
- goto out;
- }
-
- ret = audio_in_prepare(input);
- if (ret != AUDIO_IO_ERROR_NONE) {
- printf("ERROR, prepare\n");
- goto out;
- }
-
- ret = audio_in_get_buffer_size(input, &size);
- if (ret != AUDIO_IO_ERROR_NONE) {
- printf("ERROR, get_buffer_size\n");
- goto out;
- }
-
- fp = fopen(data->filename, "wb+");
- if (fp == NULL) {
- printf("ERROR, file open failed\n");
- goto out;
- }
-
- buffer = alloca(size);
-
- while (1) {
- ret = audio_in_read(input, (void *)buffer, size);
- if (ret <= 0) {
- printf("FAIL, size=%d, ret=0x%x\n", size, ret);
- goto out;
- }
-
- fwrite(buffer, size, sizeof(char), fp);
- }
-
-out:
- if (fp)
- fclose(fp);
-
- if (input) {
- audio_in_unprepare(input);
- audio_in_destroy(input);
- }
-
- if (device_list)
- if (sound_manager_free_device_list(device_list) != SOUND_MANAGER_ERROR_NONE)
- printf("fail to free device list\n");
-
- 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);
-}
-