SberDevicesã§ã¯ãé³æ¥œãèŽããããæ ç»ãèŠããããããšãã§ããããã€ã¹ã補é ããŠããŸãããæ³åã®ãšãããé³ããªããã°ãããã¯ãŸã£ããåé¡ã«ãªããŸãããåŠæ ¡ã®ç©çåŠããLinuxã®ALSAãµãã·ã¹ãã ãŸã§ãããã€ã¹ã®ãµãŠã³ãã«äœãèµ·ããããèŠãŠã¿ãŸãããã
ç§ãã¡ãèãé³ã¯äœã§ããïŒå®å šã«åçŽåããããã«ããããã¯ç§ãã¡ã®è³ã«å±ã空æ°ç²åã®æ¯åã§ãããã¡ããã圌ãã®è³ã¯å¿å°ããé³æ¥œãçªéãéãéããã¢ãŒã¿ãŒãµã€ã¯ãªã¹ãã®é³ã«å€æãããŸããããšããããæ¯åã«ãšã©ãŸããŸãããã
19äžçŽã«ã人ã ã¯ããªããé³ã®æ¯åãèšé²ããŠãããåçŸããããšãè©Šã¿ãããšãã§ããããšã«æ°ã¥ããŸããã
ãŸããæåã®é²é³ããã€ã¹ã®1ã€ãã©ã®ããã«æ©èœããããèŠãŠã¿ãŸãããã
ãã©ãã°ã©ããšãã®çºæè ããŒãã¹ãšãžãœã³
åçæäŸ
ããã§ã¯ãã¹ãŠãç°¡åã§ãã圌ãã¯ã·ãªã³ããŒãåããããããã€ã«ã§å ãã ããããã圌ãã¯æåŸã«èã§ïŒããã倧ããããããã«ïŒå 现ãã®äœããåããŸãããå°ããªéãèã«åãä»ããããŠããŸããéã¯ãã€ã«ã«å¯ãããã£ããããããç¹å¥ã«èšç·Žããã人ãã·ãªã³ããŒãã²ãã£ãŠå ±é³Žåšã«äœããèšããŸãããèã«ãã£ãŠé§åãããéããç®ã«ããŒã¿ãäœããŸãããã·ãªã³ããŒãåçã«ãããã ãã§ååãªå Žåãèã®æ¯åæ¯å¹ ã®ã·ãªã³ããŒãžã®ãå·»ããæéãžã®äŸåæ§ãæããã«ãªããŸãã
ä¿¡å·ãåçããã«ã¯ãæåããã·ãªã³ããŒãããäžåºŠåãå¿ èŠããããŸãããéãæºã«èœã¡ãèšé²ãããæ¯åãèã«äŒéãããããå ±æ¯åšã«äŒéããŸããã ããç§ãã¡ã¯é²é³ãèããŸããæ奜家ã«ããèå³æ·±ãæçš¿ãYouTubeã§ç°¡åã«èŠã€ããããšãã§ããŸãã
é»æ°ãžã®ç§»è¡
ããã§ã¯ããã£ãšçŸä»£çã§ãããããã»ã©è€éã§ã¯ãªããã®ãèŠãŠã¿ãŸããããããšãã°ããªãŒã«ãã€ã¯ã空æ°ã®æ¯åã«ããã³ã€ã«å ã®ç£ç³ã®äœçœ®ãå€åããé»ç£èªå°ã®ãããã§ãåºåã§ç£ç³ïŒãããã£ãŠèïŒã®æ¯åã®æ¯å¹ ã®æéäŸåæ§ãåŸãããŸããä»ã ãããã®äŸåæ§ã¯ããã©ã€ã«ã®ããŒã¿ã§ã¯ãªãããã€ã¯ã®åºåã®é»å§ã®æéäŸåæ§ã«ãã£ãŠè¡šãããŸãã
ãã®ãããªå€åã®è¡šçŸãã³ã³ãã¥ãŒã¿ã®ã¡ã¢ãªã«ä¿åããã«ã¯ãããããé¢æ£åããå¿ èŠããããŸããããã¯ãç¹å¥ãªããŒããŠã§ã¢ã§ããã¢ããã°-ããžã¿ã«ã³ã³ããŒã¿ãŒïŒADCïŒã«ãã£ãŠè¡ãããŸãã ADCã¯ãå ¥åã®é»å§å€ïŒADCæŽæ°æŒç®ã®å解èœãŸã§ïŒã1ç§éã«äœåºŠãèšæ¶ããã¡ã¢ãªã«æžã蟌ãããšãã§ããŸãããã®ãããª1ç§ãããã®ãµã³ãã«æ°ã¯ããµã³ãã«ã¬ãŒããšåŒã°ããŸããäžè¬çãªå€ã¯8000Hzã96000Hzã§ãã
ADCã¯å¥ã®äžé£ã®èšäºã«å€ãããããADCã®è©³çŽ°ã«ã€ããŠã¯èª¬æããŸãããäž»ãªããšã«ç§»ããŸããããLinuxãã©ã€ããŒãããããçš®é¡ã®ããã€ã¹ãåäœãããã¹ãŠã®ãµãŠã³ãã¯ãæ¯å¹ ãšæéã®äŸåé¢ä¿ã®åœ¢ã§æ£ç¢ºã«è¡šãããŸãããã®èšé²åœ¢åŒã¯PCMïŒãã«ã¹ã³ãŒãå€èª¿ïŒãšåŒã°ããŸããæç¶æéã1 / sample_rateã®ã¿ã€ã ã¹ã©ã€ã¹ããšã«ãé³ã®æ¯å¹ ã®å€ã瀺ãããŸãã .wavãã¡ã€ã«ãäœæãããã®ã¯PCMããã§ãã
é³æ¥œä»ãã®.wavãã¡ã€ã«ã®PCMèŠèŠåã®äŸã暪軞ã¯æéã瞊軞ã¯ä¿¡å·æ¯å¹ ã§ãã
ããŒãã«ã¯ã¹ããŒã«ãŒçšã®ã¹ãã¬ãªåºåããããããã¹ãã¬ãªãµãŠã³ãã1ã€ã®.wavãã¡ã€ã«ïŒå·Šå³ã®ãã£ã³ãã«ïŒã«ä¿åããæ¹æ³ãåŠã¶å¿ èŠããããŸããããã§ã¯ãã¹ãŠãåçŽã§ã-ãµã³ãã«ã¯æ¬¡ã®ããã«äº€äºã«ãªããŸãïŒ
ããŒã¿ãä¿åãããã®æ¹æ³ã¯ãã€ã³ã¿ãŒãªãŒããšåŒã°ããŸããä»ã®æ¹æ³ããããŸãããããã§ã¯æ€èšããŸããã
次ã«ãããã€ã¹éã®ããŒã¿è»¢éãæŽçããããã«å¿ èŠãªé»æ°ä¿¡å·ãææ¡ããŸãããããããŠãããã»ã©å€ãã¯å¿ èŠãããŸããïŒ
- ãããã¯ããã¯ïŒBCLKïŒã¯ãããŒããŠã§ã¢ã次ã®ãããããã€éä¿¡ãããã決å®ããããã®ã¯ããã¯ä¿¡å·ïŒãŸãã¯ã¯ããã¯ïŒã§ãã
- ãã¬ãŒã ã¯ããã¯ïŒFCLKãŸãã¯LRCLKãšãåŒã°ããŸãïŒã¯ãå¥ã®ãã£ãã«ã®éä¿¡ãéå§ããå¿ èŠããããšãã«æ©åšãç解ããã¿ã€ãã³ã°ä¿¡å·ã§ãã
- ããŒã¿ã¯ããŒã¿ãã®ãã®ã§ãã
ããšãã°ã次ã®ç¹æ§ãæã€ãã¡ã€ã«ããããŸãã
- ãµã³ãã«å¹ = 16ããã;
- ãµã³ããªã³ã°ã¬ãŒã= 48000 Hz;
- ãã£ãã«= 2ã
次ã«ã次ã®åšæ³¢æ°å€ãèšå®ããå¿ èŠããããŸãã
- FCLK = 48000 Hz;
- BCLK = 48000 * 16 * 2Hzã
ããã«å€ãã®ãã£ãã«ãéä¿¡ããããã«ãTDMãããã³ã«ã䜿çšãããŸããããã¯I2Sãšã¯ç°ãªããFCLKã®ãã¥ãŒãã£ãµã€ã¯ã«ã50ïŒ ã«ããå¿ èŠããªããªããç«ã¡äžãããšããžã¯ç°ãªããã£ãã«ã«å±ãããµã³ãã«ã®ãã±ããã®éå§ã®ã¿ãèšå®ããŸãã
äžè¬çãªã¹ããŒã
æå ã«ãã£ãã®ã¯ãã¹ããŒã«ãŒãæ¥ç¶ã§ããamlogics400ããŒãã§ãããã¢ããã¹ããªãŒã ã®Linuxã«ãŒãã«ãã€ã³ã¹ããŒã«ãããŠããŸãããã®äŸã«åãçµã¿ãŸãã
ç§ãã¡ã®ããŒãã¯ãTAS5707PHPR DACãæ¥ç¶ãããŠããSoCïŒamlogic A113xïŒã§æ§æãããŠããŸãããããŠãäžè¬çãªã¹ããŒã ã¯æ¬¡ã®ããã«ãªããŸã
ãSoCã§ã§ããããšïŒ
- SoCã«ã¯ãBCLKãLRCLKãDATAã®3ã€ã®ãã³ããããŸãã
- SoCã®ç¹å¥ãªã¬ãžã¹ã¿ãä»ããŠCLKãã³ãæ§æããæ£ããåšæ³¢æ°ãæã€ããã«ããããšãã§ããŸãã
- ãã®SoCã«æ¬¡ã®ããã«èšãããšãã§ããŸããããããã¡ã¢ãªå ã®ã¢ãã¬ã¹ã§ããPCMããŒã¿ãå«ãŸããŠããŸãããã®ããŒã¿ãDATAè¡ãä»ããŠå°ããã€éä¿¡ããŸããããã®ã¡ã¢ãªé åã¯hwbufãšåŒã°ããŸãã
ãµãŠã³ããåçããããã«ãLinuxãã©ã€ããŒã¯SoCã«BCLKããã³LRCLKã©ã€ã³ã«èšå®ããåšæ³¢æ°ãæ瀺ããŸããããã«ãLinuxãã©ã€ããŒã¯hwbufãã©ãã«ããããæããŠãããŸãã次ã«ãDACïŒTAS5707ïŒã¯DATAã©ã€ã³ãä»ããŠããŒã¿ãåä¿¡ããããã2ã€ã®ã¢ããã°é»æ°ä¿¡å·ã«å€æããŸãããããã®ä¿¡å·ã¯ã1察ã®ã¯ã€ã€ãä»ããŠéä¿¡ãããŸã{ã¢ããã°+; ã¢ããã°-}ã2ã€ã®ã¹ããŒã«ãŒã«ã
Linuxãžã®ç§»è¡
Linuxã§ãã®åè·¯ãã©ã®ããã«èŠãããã«é²ãæºåãã§ããŠããŸãããŸããLinuxã§ãµãŠã³ããæäœããããã®ãã©ã€ãã©ãªãããããŸããããã¯ã«ãŒãã«ãšãŠãŒã¶ãŒã¹ããŒã¹ã®éã«åæ£ããŠããŸããããã¯ALSAãšåŒã°ãããã®ååãæ€èšããŸãã ALSAã®æ¬è³ªã¯ããŠãŒã¶ãŒã¹ããŒã¹ãšã«ãŒãã«ããµãŠã³ãããã€ã¹ãæäœããããã®ã€ã³ã¿ãŒãã§ã€ã¹ã§ãåæãããããšã§ãã
ã«ã¹ã¿ã ALSAã©ã€ãã©ãªã¯ãioctlã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠã«ãŒãã«ãšå¯Ÿè©±ããŸãã / dev / snd /ãã£ã¬ã¯ããªã«äœæãããpcmC {x} D {y} {cãp}ããã€ã¹ã䜿çšãããŸãããããã®ããã€ã¹ã¯ãSoCãã³ããŒãäœæããå¿ èŠã®ãããã©ã€ããŒã«ãã£ãŠäœæãããŸããããšãã°ãamlogics400ã®ãã®ãã©ã«ãã®å 容ã¯æ¬¡ã®ãšããã§ãã
# ls /dev/snd/
controlC0 pcmC0D0p pcmC0D0 pcmC0D1c pcmC0D1p pcmC0D2c
pcmC {x} D {y} {cãp}ã®ååã§ïŒ
X-ãµãŠã³ãã«ãŒãçªå·ïŒããã€ãããå ŽåããããŸãïŒã
Yã¯ãã«ãŒãäžã®ã€ã³ã¿ãŒãã§ã€ã¹ã®çªå·ã§ãïŒããšãã°ãpcmC0D0pã¯tdmã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠã¹ããŒã«ãŒã§åçããpcmC0D1c-ã¯å¥ã®ããŒããŠã§ã¢ã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠãã€ã¯ããã®ãµãŠã³ããé²é³ããŸãïŒã
p-ãµãŠã³ããåçããããã®ããã€ã¹ïŒåçïŒã瀺ããŸãã
c-é³å£°ãé²é³ããããã®ããã€ã¹ïŒãã£ããã£ïŒã瀺ããŸãã
ãã®å ŽåãpcmC0D0pããã€ã¹ã¯åçI2Sã€ã³ã¿ãŒãã§ã€ã¹ã«æ£ç¢ºã«å¯Ÿå¿ããŸããD1ã¯spdifãD2ã¯pdmãã€ã¯ã§ããããããã«ã€ããŠã¯èª¬æããŸããã
ããã€ã¹ããªãŒ
ãµãŠã³ãã«ãŒãã®èª¬æã¯device_tree [arch / arm64 / boot / dts / amlogic / meson-axg-s400.dts]ã§å§ãŸããŸãïŒ
âŠ
sound {
compatible = "amlogic,axg-sound-card";
model = "AXG-S400";
audio-aux-devs = <&tdmin_a>, <&tdmin_b>, <&tdmin_c>,
<&tdmin_lb>, <&tdmout_c>;
âŠ
dai-link-6 {
sound-dai = <&tdmif_c>;
dai-format = "i2s";
dai-tdm-slot-tx-mask-2 = <1 1>;
dai-tdm-slot-rx-mask-1 = <1 1>;
mclk-fs = <256>;
codec-1 {
sound-dai = <&speaker_amp1>;
};
};
âŠ
dai-link-7 {
sound-dai = <&spdifout>;
codec {
sound-dai = <&spdif_dit>;
};
};
dai-link-8 {
sound-dai = <&spdifin>;
codec {
sound-dai = <&spdif_dir>;
};
};
dai-link-9 {
sound-dai = <&pdm>;
codec {
sound-dai = <&dmics>;
};
};
};
âŠ
&i2c1 {
speaker_amp1: audio-codec@1b {
compatible = "ti,tas5707";
reg = <0x1b>;
reset-gpios = <&gpio_ao GPIOAO_4 GPIO_ACTIVE_LOW>;
#sound-dai-cells = <0>;
âŠ
};
};
&tdmif_c {
pinctrl-0 = <&tdmc_sclk_pins>, <&tdmc_fs_pins>,
<&tdmc_din1_pins>, <&tdmc_dout2_pins>,
<&mclk_c_pins>;
pinctrl-names = "default";
status = "okay";
};
ããã§ã¯ã/ dev / sndã«è¡šç€ºããã3ã€ã®ããã€ã¹ïŒtdmif_cãspdifãpdmïŒã衚瀺ãããŸãã
é³ãäŒããè£ çœ®ã¯dai-link-6ãšåŒã°ããŸãã TDMãã©ã€ããŒã®å¶åŸ¡äžã§åäœããŸããçåãçããŸããI2SããããŠçªç¶TDMãä»ããŠãµãŠã³ããéä¿¡ããæ¹æ³ã«ã€ããŠè©±ããŠããŸãããããã¯ç°¡åã«èª¬æã§ããŸããäžèšã§æžããããã«ãI2Sã¯åãTDMã§ãããLRCLKã®ãã¥ãŒãã£ãµã€ã¯ã«ãšãã£ãã«æ°ã®èŠä»¶ãæ確ã«ãªã£ãŠããŸãã2ã€ããã¯ãã§ãã次ã«ãTDMãã©ã€ããŒã¯dai-format = "i2s"ãã£ãŒã«ããèªã¿åããŸãã圌ã¯I2Sã¢ãŒãã§äœæ¥ããå¿ èŠãããããšãç解ããŸãã
次ã«ãspeaker_amp1æ§é ã䜿çšããŠãã©ã®DACïŒLinuxå ã§ã¯ãã³ãŒããã¯ããšåŒã°ããŸãïŒãããŒãã«ã€ã³ã¹ããŒã«ãããŠãããã瀺ãããŸããã©ã®I2Cã©ã€ã³ã«æ¥ç¶ãããŠããããããã«ç€ºãããããšã«æ³šæããŠãã ããïŒI2Sãšæ··åããªãã§ãã ããïŒïŒTAS5707DACãæ¥ç¶ãããŠããŸããã¢ã³ãããªã³ã«ãªãããã©ã€ããŒãã調æŽãããã®ã¯ãã®ç·ã«æ²¿ã£ãŠããŸãã
tdmif_cæ§é ã¯ãã©ã®SoCãã³ãI2Sã€ã³ã¿ãŒãã§ãŒã¹ãšããŠæ©èœããããèšè¿°ããŸãã
ALSASoCã¬ã€ã€ãŒ
å éšã§ãªãŒãã£ãªããµããŒãããSoCã®å ŽåãLinuxã«ã¯ALSASoCã¬ã€ã€ãŒããããŸããããã«ãããã³ãŒããã¯ãèšè¿°ã§ãïŒããã¯ãDACãALSAçšèªã§åŒã°ãããã®ã§ããããšãå¿ããªãã§ãã ããïŒããããã®ã³ãŒããã¯ã®æ¥ç¶æ¹æ³ãæå®ã§ããŸãã
Linuxã«ãŒãã«çšèªã®ã³ãŒããã¯ã¯ãDAIïŒããžã¿ã«ãªãŒãã£ãªã€ã³ã¿ãŒãã§ã€ã¹ïŒãšåŒã°ããŸããSoCå ã«ããTDM / I2Sã€ã³ã¿ãŒãã§ã€ã¹èªäœã¯DAIãšãåŒã°ããããã䜿çšããäœæ¥ãåæ§ã®æ¹æ³ã§å®è¡ãããŸãã
ãã©ã€ãã¯ãstructsnd_soc_daiã䜿çšããŠã³ãŒããã¯ãèšè¿°ããŸããã³ãŒããã¯ã®èª¬æã§æãèå³æ·±ãéšåã¯ãTDMéä¿¡ãã©ã¡ãŒã¿ãèšå®ããããã®æäœã§ãããããã¯ããã«ãããŸãïŒstruct snd_soc_dai-> struct snd_soc_dai_driver-> structsnd_soc_dai_opsãç解ããããã®æãéèŠãªãã£ãŒã«ãïŒsound / soc / soc-dai.hïŒãèããŠã¿ãŸãããïŒ
struct snd_soc_dai_ops {
/*
* DAI clocking configuration.
* Called by soc_card drivers, normally in their hw_params.
*/
int (*set_sysclk)(struct snd_soc_dai *dai,
int clk_id, unsigned int freq, int dir);
int (*set_pll)(struct snd_soc_dai *dai, int pll_id, int source,
unsigned int freq_in, unsigned int freq_out);
int (*set_clkdiv)(struct snd_soc_dai *dai, int div_id, int div);
int (*set_bclk_ratio)(struct snd_soc_dai *dai, unsigned int ratio);
...
TDMã¯ããã¯ãå
¬éããããŸãã«ãã®æ©èœããããã®æ©èœã¯éåžžãSoCãã³ããŒã«ãã£ãŠå®è£
ãããŸãã
...
int (*hw_params)(struct snd_pcm_substream *,
struct snd_pcm_hw_params *, struct snd_soc_dai *);
...
æãèå³æ·±ãé¢æ°ã¯hw_paramsïŒïŒã§ãã
åçããããšããŠããPCMãã¡ã€ã«ã®ãã©ã¡ãŒã¿ãŒã«åŸã£ãŠãã¹ãŠã®SoCããŒããŠã§ã¢ãæ§æããããã«å¿ èŠã§ããåŸã§äžèšã®ã°ã«ãŒãã®é¢æ°ãåŒã³åºããŠTDMã¯ããã¯ãã€ã³ã¹ããŒã«ããã®ã¯åœŒå¥³ã§ãã
...
int (*trigger)(struct snd_pcm_substream *, int,
struct snd_soc_dai *);
...
ãããŠããã®é¢æ°ã¯ãã³ãŒããã¯ãæ§æããåŸã®æåŸã®ã¹ããããå®è¡ããŸã-ã³ãŒããã¯ãã¢ã¯ãã£ãã¢ãŒãã«ããŸãã
ã¢ããã°ãµãŠã³ããã¹ããŒã«ãŒã«åºåããDACã¯ããŸã£ããåãæ§é ã§èšè¿°ãããŠããŸãããã®å Žåã®snd_soc_dai_opsã¯ãæ£ãã圢åŒã§ããŒã¿ãåä¿¡ããããã«DACãæ§æããŸããDACã®ãã®èšå®ã¯ãéåžžãI2Cã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠè¡ãããŸãã
æ§é å ã®ããã€ã¹ããªãŒã§æå®ãããŠãããã¹ãŠã®ã³ãŒããã¯ã
dai-link-6 {
...
codec-1 {
sound-dai = <&speaker_amp1>;
};
};
-ãããŠãããã®å€ããååšããå¯èœæ§ãããã1ã€ã®ãªã¹ãã«è¿œå ããã/ dev / snd / pcm *ããã€ã¹ã«æ·»ä»ãããŸããããã¯ããµãŠã³ããåçãããšãã«ãã«ãŒãã«ãå¿ èŠãªãã¹ãŠã®ã³ãŒããã¯ãã©ã€ããŒããã€ãã¹ããŠãããããæ§æ/æå¹åã§ããããã«ããããã«å¿ èŠã§ãã
åã³ãŒããã¯ã¯ããµããŒãããPCMãã©ã¡ãŒã¿ãéç¥ããå¿ èŠããããŸããããã¯æ§é ã§ãããè¡ããŸãïŒ
struct snd_soc_pcm_stream {
const char *stream_name;
u64 formats; /* SNDRV_PCM_FMTBIT_* */
unsigned int rates; /* SNDRV_PCM_RATE_* */
unsigned int rate_min; /* min rate */
unsigned int rate_max; /* max rate */
unsigned int channels_min; /* min channels */
unsigned int channels_max; /* max channels */
unsigned int sig_bits; /* number of bits of content */
};
ãã§ãŒã³å ã®ããããã®ã³ãŒããã¯ãç¹å®ã®ãã©ã¡ãŒã¿ãŒããµããŒãããŠããªãå Žåããã¹ãŠããšã©ãŒã§çµäºããŸãã
amlogic s400ã«å¯Ÿå¿ããTDMãã©ã€ããŒã®å®è£ ã¯ãsound / soc / meson /axg-tdm-interface.cã§è¡šç€ºã§ããŸãããããŠãTAS5707ã³ãŒããã¯ãã©ã€ãã®å®è£ ã¯sound / soc / codecs /tas571x.cã«ãããŸãã
ãŠãŒã¶ãŒéšå
次ã«ããŠãŒã¶ãŒããµãŠã³ããåçããããšãã«äœãèµ·ããããèŠãŠã¿ãŸããããã«ã¹ã¿ã ALSAå®è£ ã®ç¿åŸããããäŸã¯tinyalsaã§ãã以äžã®ãã¹ãŠã®ãœãŒã¹ã³ãŒãã¯ãããã§è¡šç€ºã§ããŸãã
tinyplayãŠãŒãã£ãªãã£ãå«ãŸããŠããŸããå®è¡ããå¿ èŠã®ãããµãŠã³ããåçããã«ã¯ïŒ
bash$ tinyplay ./music.wav -D 0 -d 0
ïŒ-Dããã³-dãªãã·ã§ã³ã¯ã/ dev / snd / pcmC0D0pãä»ããŠãµãŠã³ããåçããããã«æ瀺ããŸãïŒã
äœãèµ·ãã£ãŠããŸããïŒ
ãããçããããã¯å³ã§ããã®åŸã«èª¬æãç¶ããŸãã
- [userspace] .wavããããŒã解æããŠãåçãããŠãããã¡ã€ã«ã®PCMãã©ã¡ãŒã¿ãŒïŒãµã³ãã«ã¬ãŒãããããå¹ ããã£ãã«ïŒãèŠã€ããŸãããã¹ãŠã®ãã©ã¡ãŒã¿ãŒãstructsnd_pcm_hw_paramsã«è¿œå ããŸãã
- [ãŠãŒã¶ãŒã¹ããŒã¹]ããã€ã¹/ dev / snd / pcmC0D0pãéããŸãã
- [userspace] ioctl(âŠ, SNDRV_PCM_IOCTL_HW_PARAMS ,âŠ), PCM- .
- [kernel] PCM-, . :
- ;
- .
- , /dev/snd/pcmC0D0p ( ), .
- [userspace] , PCM-.
- [userspace] ioctl(âŠ, SNDRV_PCM_IOCTL_WRITEI_FRAMES, âŠ). I WRITEI , PCM- interleaved-.
- [kernelspace] , /dev/snd/pcmC0D0p , .
- [kernelspace] copy_from_userïŒïŒã䜿çšããŠããŠãŒã¶ãŒbufãhwbufïŒäžè¬ã¹ããŒã ãåç §ïŒã«ã³ããŒããŸãã
- [ãŠãŒã¶ãŒã¹ããŒã¹] goto6ã
ioctlã®ã«ãŒãã«éšåã®å®è£ ã¯ãSNDRV_PCM_IOCTL_ *ãšããåèªãæ€çŽ¢ããããšã§è¡šç€ºã§ããŸãã
çµè«
ããã§ãLinuxã«ãŒãã«ã®ã©ãã«ãµãŠã³ããå ¥ãã®ããããããŸããã次ã®èšäºã§ã¯ãAndroidã¢ããªã±ãŒã·ã§ã³ãããµãŠã³ããã©ã®ããã«åçãããããåæããŸãããããã«ã¯ãŸã é·ãéã®ãããããŸãã