switch (dai->id) { case WSA_CODEC_DMA_TX_0: case WSA_CODEC_DMA_TX_1: case WSA_CODEC_DMA_TX_2: case VA_CODEC_DMA_TX_0: case VA_CODEC_DMA_TX_1: case VA_CODEC_DMA_TX_2: case TX_CODEC_DMA_TX_0: case TX_CODEC_DMA_TX_1: case TX_CODEC_DMA_TX_2: case TX_CODEC_DMA_TX_3: case TX_CODEC_DMA_TX_4: case TX_CODEC_DMA_TX_5: if (!tx_ch_mask) {
dev_err(dai->dev, "tx slot not found\n"); return -EINVAL;
}
if (tx_num > AR_PCM_MAX_NUM_CHANNEL) {
dev_err(dai->dev, "invalid tx num %d\n",
tx_num); return -EINVAL;
} for (i = 0; i < tx_num; i++)
cfg->channel_map[i] = tx_ch_mask[i];
break; case WSA_CODEC_DMA_RX_0: case WSA_CODEC_DMA_RX_1: case RX_CODEC_DMA_RX_0: case RX_CODEC_DMA_RX_1: case RX_CODEC_DMA_RX_2: case RX_CODEC_DMA_RX_3: case RX_CODEC_DMA_RX_4: case RX_CODEC_DMA_RX_5: case RX_CODEC_DMA_RX_6: case RX_CODEC_DMA_RX_7: /* rx */ if (!rx_ch_mask) {
dev_err(dai->dev, "rx slot not found\n"); return -EINVAL;
} if (rx_num > APM_PORT_MAX_AUDIO_CHAN_CNT) {
dev_err(dai->dev, "invalid rx num %d\n",
rx_num); return -EINVAL;
} for (i = 0; i < rx_num; i++)
cfg->channel_map[i] = rx_ch_mask[i];
break; default:
dev_err(dai->dev, "%s: invalid dai id 0x%x\n",
__func__, dai->id); return -EINVAL;
}
if (dai_data->is_port_started[dai->id]) {
rc = q6apm_graph_stop(dai_data->graph[dai->id]);
dai_data->is_port_started[dai->id] = false; if (rc < 0)
dev_err(dai->dev, "fail to close APM port (%d)\n", rc);
}
if (dai_data->graph[dai->id]) {
q6apm_graph_close(dai_data->graph[dai->id]);
dai_data->graph[dai->id] = NULL;
}
}
/** * It is recommend to load DSP with source graph first and then sink * graph, so sequence for playback and capture will be different
*/ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
graph = q6apm_graph_open(dai->dev, NULL, dai->dev, graph_id); if (IS_ERR(graph)) {
dev_err(dai->dev, "Failed to open graph (%d)\n", graph_id);
rc = PTR_ERR(graph); return rc;
}
dai_data->graph[graph_id] = graph;
}
cfg->direction = substream->stream;
rc = q6apm_graph_media_format_pcm(dai_data->graph[dai->id], cfg); if (rc) {
dev_err(dai->dev, "Failed to set media format %d\n", rc); goto err;
}
rc = q6apm_graph_prepare(dai_data->graph[dai->id]); if (rc) {
dev_err(dai->dev, "Failed to prepare Graph %d\n", rc); goto err;
}
rc = q6apm_graph_start(dai_data->graph[dai->id]); if (rc < 0) {
dev_err(dai->dev, "Failed to start APM port %d\n", dai->id); goto err;
}
dai_data->is_port_started[dai->id] = true;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.