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 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);
-}
-
static int _record_and_play(int length, int num, int ch)
{
int ret, size, i;
_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 (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] [capture without EC]\n");
}
return 0;
}