On 12/29/2014 04:13 PM, Mark Brown wrote:
On Tue, Dec 23, 2014 at 09:09:27AM +0000, Qais Yousef wrote:
In soc_new_compress() when rtd->dai_link->daynmic is set, we create the pcm substreams with this call:
ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, num, 1, 0, &be_pcm);
which passes 0 as capture_count leading to
be_pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream
being NULL, hence when trying to set rtd a few lines below we get an oops. Fix by removing this line of code since CAPTURE substream will always be NULL.
Why will the capture stream always be NULL? There should be no intrinsic reason why we can't have hardware support for capturing compressed audio.
I think because we pass 0 as capture_count in snd_pcm_new_internal(). If I read the code correctly this will lead to _snd_pcm_new() to be called which in return will call snd_pcm_new_stream(pcm, SNDRV_PCM_STREAM_CAPTURE, capture_count) which will cause no substream to be allocated for the capture case, hence being NULL. I get an oops in my experimental driver when I set dynamic = 1 in FE dai link. If I did something wrong there that caused this, it's not obvious to me how.
Maybe a better fix would be to replace the 1 and 0 in snd_pcm_new_internal() call with rtd->dai_link->dpcm_playback and rtd->dai_link->dpcm_capture.