#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,
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);
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;
}
goto out;
}
- fp = fopen(filename, "wb+");
+ fp = fopen(data->filename, "wb+");
if (fp == NULL) {
printf("ERROR, file open failed\n");
goto out;
}
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)
_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");
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;
}