struct cras_iodev *loopback_iodev_create(enum CRAS_LOOPBACK_TYPE type) { struct cras_iodev *iodev; struct cras_ionode *node; enum CRAS_NODE_TYPE node_type; switch (type) { case LOOPBACK_POST_MIX_PRE_DSP: node_type = CRAS_NODE_TYPE_POST_MIX_PRE_DSP; break; case LOOPBACK_POST_DSP: node_type = CRAS_NODE_TYPE_POST_DSP; break; default: return NULL; } iodev = create_loopback_iodev(type); if (iodev == NULL) return NULL; /* Create a dummy ionode */ node = (struct cras_ionode *)calloc(1, sizeof(*node)); node->dev = iodev; node->type = node_type; node->plugged = 1; node->volume = 100; node->stable_id = iodev->info.stable_id; node->stable_id_new = iodev->info.stable_id_new; node->software_volume_needed = 0; node->max_software_gain = 0; strcpy(node->name, loopdev_names[type]); cras_iodev_add_node(iodev, node); cras_iodev_set_active_node(iodev, node); cras_iodev_list_add_input(iodev); return iodev; }
struct cras_iodev *hfp_iodev_create( enum CRAS_STREAM_DIRECTION dir, struct cras_bt_device *device, struct hfp_slc_handle *slc, enum cras_bt_device_profile profile, struct hfp_info *info) { struct hfp_io *hfpio; struct cras_iodev *iodev; struct cras_ionode *node; const char *name; hfpio = (struct hfp_io *)calloc(1, sizeof(*hfpio)); if (!hfpio) goto error; iodev = &hfpio->base; iodev->direction = dir; hfpio->device = device; hfpio->slc = slc; /* Set iodev's name to device readable name or the address. */ name = cras_bt_device_name(device); if (!name) name = cras_bt_device_object_path(device); snprintf(iodev->info.name, sizeof(iodev->info.name), "%s", name); iodev->info.name[ARRAY_SIZE(iodev->info.name) - 1] = 0; iodev->info.stable_id = SuperFastHash( cras_bt_device_object_path(device), strlen(cras_bt_device_object_path(device)), strlen(cras_bt_device_object_path(device))); iodev->open_dev= open_dev; iodev->frames_queued = frames_queued; iodev->delay_frames = delay_frames; iodev->get_buffer = get_buffer; iodev->put_buffer = put_buffer; iodev->flush_buffer = flush_buffer; iodev->close_dev = close_dev; iodev->update_supported_formats = update_supported_formats; iodev->update_active_node = update_active_node; iodev->set_volume = set_hfp_volume; node = (struct cras_ionode *)calloc(1, sizeof(*node)); node->dev = iodev; strcpy(node->name, iodev->info.name); node->plugged = 1; node->type = CRAS_NODE_TYPE_BLUETOOTH; node->volume = 100; gettimeofday(&node->plugged_time, NULL); cras_bt_device_append_iodev(device, iodev, profile); cras_iodev_add_node(iodev, node); cras_iodev_set_active_node(iodev, node); hfpio->info = info; hfp_register_packet_size_changed_callback(info, hfp_packet_size_changed, hfpio); return iodev; error: if (hfpio) { hfp_free_resources(hfpio); free(hfpio); } return NULL; }