+ audio_in_h input = NULL;
+ audio_out_h output = NULL;
+ char *buffer = NULL;
+ int i = 0;
+
+ ret = audio_in_create(16000, AUDIO_CHANNEL_MONO, AUDIO_SAMPLE_TYPE_S16_LE, &input);
+ if (ret != AUDIO_IO_ERROR_NONE) {
+ printf("audio_in_create_ex failed. \n");
+ return ret;
+ }
+ ret = audio_out_create_new(16000, AUDIO_CHANNEL_MONO, AUDIO_SAMPLE_TYPE_S16_LE, &output);
+ if (ret != AUDIO_IO_ERROR_NONE) {
+ printf("audio_out_create_new failed. \n");
+ goto exit;
+ }
+
+ ret = audio_in_prepare(input);
+ if (ret != 0) {
+ printf("audio_in_prepare failed, err(0x%x)\n", ret);
+ goto exit;
+ }
+
+ ret = audio_in_get_buffer_size(input, &size);
+ if (ret != AUDIO_IO_ERROR_NONE) {
+ printf("audio_in_get_buffer_size failed, err(0x%x)\n", ret);
+ goto exit;
+ }
+
+ printf("size(%d)\n", size);
+ buffer = alloca(size);
+
+ ret = audio_out_prepare(output);
+ if (ret != 0) {
+ printf("audio_out_prepare failed, err(0x%x)\n", ret);
+ goto exit;
+ }
+
+ if (buffer == NULL) {
+ printf("buffer is null\n");
+ ret = -1;
+ goto exit;
+ }
+
+ printf("Start to loopback(read/write) with [16kHz/MONO/S16LE]!!!\n");
+
+ while (1) {
+ ret = audio_in_read(input, (void *)buffer, size);
+ if (ret > AUDIO_IO_ERROR_NONE) {
+ ret = audio_out_write(output, buffer, size);
+ if (ret > AUDIO_IO_ERROR_NONE) {
+ printf(".");
+ i++;
+ if (i % 10 == 0)
+ printf("|");
+ if (i % 100 == 0) {
+ printf("\n");
+ i = 0;
+ }
+ } else {
+ printf("audio read success, write failed. buffer(%p), size(%d)\n", buffer, size);
+ }
+ } else {
+ printf("audio read/write failed. buffer(%p), size(%d)\n", buffer, size);
+ }
+ usleep(10000);
+ }
+
+exit:
+ if (input)
+ audio_in_destroy(input);
+ if (output)
+ audio_out_destroy(output);
+
+ return ret;
+
+}
+
+audio_in_h input;
+audio_out_h output;
+
+FILE *fp_w = NULL;
+
+sound_stream_info_h g_stream_info_read_h = NULL;
+sound_stream_info_h g_stream_info_write_h = NULL;
+
+static void _focus_cb(sound_stream_info_h stream_info, sound_stream_focus_mask_e focus_mask,
+ sound_stream_focus_state_e focus_state,
+ sound_stream_focus_change_reason_e reason_for_change, int sound_behavior,
+ const char *additional_info, void *user_data)
+{
+ printf("*** focus_callback_read is called, stream_info(%p, read(%p)/write(%p)) ***\n",
+ stream_info, g_stream_info_read_h, g_stream_info_write_h);
+ printf(" - reason_for_change(%d), additional_info(%s), user_data(%p)\n",
+ reason_for_change, additional_info, user_data);
+ printf(" - focus_state is :%d \n", focus_state);
+
+ return;
+}
+
+static void _audio_io_stream_read_cb(audio_in_h handle, size_t nbytes, void *user_data)
+{
+ const void *buffer = NULL;
+ unsigned int len = (unsigned int)nbytes;
+
+ if (len == 0)
+ return;
+
+ audio_in_peek(handle, &buffer, &len);
+ if (fp_w)
+ fwrite(buffer, sizeof(char), len, fp_w);
+ audio_in_drop(handle);
+}
+
+static void _audio_io_stream_write_cb(audio_out_h handle, size_t nbytes, void *user_data)
+{
+ short *buffer = NULL;
+ int i = 0;
+
+ if (nbytes == 0)
+ return;
+
+ buffer = (short *)malloc(nbytes);
+ if (buffer == NULL) {
+ printf("malloc failed\n");
+ return;
+ }
+ memset(buffer, 0, nbytes);
+
+ for (i = 0; i < nbytes / 2; i += 2) {
+ buffer[i] = (short)32768 *test_wav.sine[test_wav.left_channel]; /* left */
+ buffer[i + 1] = (short)32768 *test_wav.sine[test_wav.right_channel]; /* right */
+ test_wav.left_channel += 1;
+ if (test_wav.left_channel >= TABLE_SIZE)
+ test_wav.left_channel -= TABLE_SIZE;
+ test_wav.right_channel += 3;
+ if (test_wav.right_channel >= TABLE_SIZE)
+ test_wav.right_channel -= TABLE_SIZE;
+ }
+
+ audio_out_write(handle, buffer, nbytes);
+
+ free(buffer);
+}
+
+int _convert_cmd_and_run(char cmd, int mode)
+{
+ int ret = 0;
+ switch (cmd) {
+ case 'P':
+ if (mode & 0x01)
+ ret = audio_out_prepare(output);
+ if (mode & 0x02)
+ ret = audio_in_prepare(input);
+ break;
+ case 'u':
+ if (mode & 0x01)
+ ret = audio_out_unprepare(output);
+ if (mode & 0x02)
+ ret = audio_in_unprepare(input);
+ break;
+ case 'p':
+ if (mode & 0x01)
+ ret = audio_out_pause(output);
+ if (mode & 0x02)
+ ret = audio_in_pause(input);
+ break;
+ case 'r':
+ if (mode & 0x01)
+ ret = audio_out_resume(output);
+ if (mode & 0x02)
+ ret = audio_in_resume(input);
+ break;
+ case 'd':
+ if (mode & 0x01)
+ ret = audio_out_drain(output);
+ break;
+ case 'f':
+ if (mode & 0x01)
+ ret = audio_out_flush(output);
+ if (mode & 0x02)
+ ret = audio_in_flush(input);
+ break;
+ case 'i':
+ ret = sound_manager_create_stream_information(SOUND_STREAM_TYPE_MEDIA, _focus_cb, NULL, &g_stream_info_write_h);
+ if (ret)
+ printf("fail to sound_manager_create_stream_information(), ret(0x%x)\n", ret);
+ break;
+ case 'q': /* quit */
+ ret = 1;
+ break;
+ default:
+ ret = 1;
+ break;
+ }
+ return ret;
+}
+
+int audio_io_async_test(int mode)
+{
+ int ret, size;
+ char *buffer = NULL;
+ int i = 0;
+
+ char cmd = 0;
+ int cmd_ret;
+
+ int write_mode = (mode & 0x01);
+ int read_mode = (mode & 0x02);
+
+ sound_stream_focus_state_e playback_focus_state;
+ sound_stream_focus_state_e recording_focus_state;
+
+ if ((write_mode == 0) && (read_mode == 0)) {
+ printf("not vaild mode.\n");
+ return 0;
+ }
+
+ if (read_mode) {
+
+ printf("audio_in_create\n");
+ ret = audio_in_create(44100, AUDIO_CHANNEL_STEREO, AUDIO_SAMPLE_TYPE_S16_LE, &input);
+ if (ret != AUDIO_IO_ERROR_NONE) {
+ printf("audio_in_create_ex failed. \n");
+ return 0;
+ }
+ printf("audio_in_create success!!! [%p]\n", input);
+
+ ret = audio_in_set_stream_cb(input, _audio_io_stream_read_cb, NULL);
+ if (ret != AUDIO_IO_ERROR_NONE) {
+ printf("audio_in_set_stream_cb failed. \n");
+ goto EXIT;
+ }
+ printf("audio_in_set_stream_cb success!!! [%p]\n", input);
+
+ ret = audio_in_set_state_changed_cb(input, _audio_in_state_cb, NULL);
+ if (ret != AUDIO_IO_ERROR_NONE) {
+ printf("audio_out_set_state_changed_cb failed. \n");
+ goto EXIT;
+ }
+ printf("audio_out_set_state_changed_cb success!!! [%p]\n", input);
+
+ ret = sound_manager_create_stream_information(SOUND_STREAM_TYPE_MEDIA, _focus_cb, NULL, &g_stream_info_read_h);
+ if (ret) {
+ printf("fail to sound_manager_create_stream_information(), ret(0x%x)\n", ret);
+ goto EXIT;
+ }
+ ret = audio_in_set_sound_stream_info(input, g_stream_info_read_h);
+ if (ret)
+ printf("fail to audio_in_set_sound_stream_info(), ret(0x%x)\n", ret);
+
+ ret = sound_manager_acquire_focus(g_stream_info_read_h, SOUND_STREAM_FOCUS_FOR_RECORDING, SOUND_BEHAVIOR_NONE, NULL);
+ if (ret) {
+ printf("fail to sound_manager_acquire_focus() for RECORDING, ret(0x%x)\n", ret);
+ goto EXIT;
+ }
+
+ fp_w = fopen("/tmp/pcm_w.raw", "w");
+ }
+
+ if (write_mode) {
+ printf("before audio_out_create_new\n");
+ getchar();
+
+ printf("audio_out_create_new\n");
+ ret = audio_out_create_new(44100, AUDIO_CHANNEL_STEREO, AUDIO_SAMPLE_TYPE_S16_LE, &output);
+ if (ret != AUDIO_IO_ERROR_NONE) {
+ printf("audio_out_create_new failed. \n");
+ goto EXIT;
+ }
+ printf("audio_out_create_new success!!! [%p]\n", output);
+
+ ret = audio_out_set_stream_cb(output, _audio_io_stream_write_cb, NULL);
+ if (ret != AUDIO_IO_ERROR_NONE) {
+ printf("audio_out_set_stream_cb failed. \n");
+ goto EXIT;
+ }
+ printf("audio_out_set_stream_cb success!!! [%p]\n", output);
+
+ ret = audio_out_set_state_changed_cb(output, _audio_out_state_cb, NULL);
+ if (ret != AUDIO_IO_ERROR_NONE) {
+ printf("audio_out_set_state_changed_cb failed. \n");
+ goto EXIT;
+ }
+ printf("audio_out_set_state_changed_cb success!!! [%p]\n", output);
+
+ ret = sound_manager_create_stream_information(SOUND_STREAM_TYPE_MEDIA, _focus_cb, NULL, &g_stream_info_write_h);
+ if (ret) {
+ printf("fail to sound_manager_create_stream_information(), ret(0x%x)\n", ret);
+ goto EXIT;
+ }
+
+ ret = audio_out_set_sound_stream_info(output, g_stream_info_write_h);
+ if (ret)
+ printf("fail to audio_out_set_sound_stream_info(), ret(0x%x)\n", ret);
+
+ ret = sound_manager_acquire_focus(g_stream_info_write_h, SOUND_STREAM_FOCUS_FOR_PLAYBACK, SOUND_BEHAVIOR_NONE, NULL);
+ if (ret) {
+ printf("fail to sound_manager_acquire_focus() for PLAYBACK, ret(0x%x)\n", ret);
+ goto EXIT;
+ }
+
+ /* generate wave data */
+ for (i = 0; i < TABLE_SIZE; i++)
+ test_wav.sine[i] = 0.9 * (float)sin(((double)i / (double)TABLE_SIZE) * M_PI * 2.);
+ test_wav.left_channel = test_wav.right_channel = 0;
+ }
+
+ if (read_mode) {
+ printf("before audio_in_prepare\n");
+ getchar();
+ printf("audio_in_prepare\n");
+ ret = audio_in_prepare(input);