20151210:按照2ch-in,2ch-out饵较,DSDout拍嵌,修改的audioin_deliver()的部分內(nèi)容

一:<略>

二:按照2ch-in,2ch-out循诉,DSD out横辆,修改的audioin_deliver()的部分內(nèi)容

{
       #if (I2S_CHANS_ADC != 0)
           /* Input previous L sample into L in buffer */
           /* First input (i.e. frameCount == 0) we read last ADC channel ofprevious frame.. */
           unsigned buffIndex = !readBuffNo;

       #pragma loop unroll
           {   // p_i2s_adc[0] :> sample;
                // Manual IN instruction sincecompiler generates an extra setc per IN (bug #15256)
                asm volatile("in %0,res[%1]" : "=r"(sample)  :"r"(p_i2s_adc[0]));
 
                tempsample=bitrev(sample);
                /* Note the use of readBuffNochanges based on frameCount */
                if(buffIndex)
                    samplesIn_1[0] =tempsample;//bitrev(sample); // channels 0, 2, 4.. on each line.
                else
                    samplesIn_0[0] =tempsample;//bitrev(sample);
           }
       #endif
           xscope_int(PLVALUE,tempsample);

           /* LR clock delayed by one clock, This is so MSB is output on thefalling edge of BCLK
            * after the falling edge on which LRCLK was toggled. (see I2S spec) */
           p_lrclk <: 0x80000000;/* Generate clocks LR Clock low - LEFT */

       #pragma xta endpoint "i2s_output_l"
       #if (I2S_CHANS_DAC != 0) && (NUM_USB_CHAN_OUT != 0)
       #pragma loop unroll
           /* Output "even" channel to DAC (i.e. left) */
           {
                p_i2s_dac[0] <:bitrev(samplesOut[0]);
           }
       #endif
           doI2SClocks(divide);/* Clock out the LR Clock, the DAC data and Clock inthe next sample into ADC */
 
       #if (I2S_CHANS_ADC != 0)
           /* Channels 0, 2, 4.. on each line */
       #pragma loop unroll
           {
           /* Manual IN instruction since compiler generates an extra setc per IN(bug #15256) */
                asm volatile("in %0,res[%1]" : "=r"(sample)  :"r"(p_i2s_adc[0]));
                tempsample=bitrev(sample);
                if(buffIndex)
                    samplesIn_1[1] = tempsample;//bitrev(sample);// channels 1, 3, 5.. on each line.
                else
                    samplesIn_0[1] =tempsample;//bitrev(sample); // channels 1, 3, 5.. on each line.
           }
       #endif
           xscope_int(PRVALUE,tempsample);
            p_lrclk <: 0x7FFFFFFF;/* Generateclocks LR Clock high - RIGHT */
 
       #pragma xta endpoint "i2s_output_r"
       #if (I2S_CHANS_DAC != 0) && (NUM_USB_CHAN_OUT != 0)
           /* Output "odd" channel to DAC (i.e. right) */
       #pragma loop unroll
           {
                p_i2s_dac[0] <:bitrev(samplesOut[1]);
           }
       #endif
           doI2SClocks(divide);
       }  // !dsdMode

三:進(jìn)一步的修改:去掉不必要的預(yù)編譯,用循環(huán)代替類似段

(1)#pragma loop unroll命令茄猫,編譯器在進(jìn)行編譯時(shí)狈蚤,遇到該命令就會對循環(huán)進(jìn)行展開。

由于已經(jīng)去掉循環(huán)划纽,因此可將這一條預(yù)編譯命令去掉脆侮。

(2)#pragma xtaendpoint "i2s_output_r" ,xta是另一種芯片勇劣,帶ARM核靖避,因此可去掉。

(3)用循環(huán)表示左右聲道的處理比默,將類似的兩段代碼寫成一段幻捏,注意用#pragma loop unroll預(yù)編譯指令展開

(4)用了兩個(gè)數(shù)組(samplesIn_1[],samplesIn_0[])來存儲錄音數(shù)據(jù),注意從I2S讀入的是一個(gè)數(shù)組命咐,而DoSampleTransfer中用的是另一個(gè)數(shù)組篡九。

 {
            int i=0;
        #pragma loop unroll //預(yù)編譯命令,將下面循環(huán)展開
            for(i=0;i<2;i++)    //i=0: even channel left;i=1:odd channelright.
            {
            /* Input previous Lsample into L in buffer */
            /* First input (i.e.frameCount == 0) we read last ADC channel of previous frame.. */
                unsigned buffIndex = !readBuffNo;//(frameCount< 3) ? !readBuffNo : readBuffNo;
                // p_i2s_adc[0] :>sample;
                // Manual IN instructionsince compiler generates an extra setc per IN (bug #15256)
                asm volatile("in %0,res[%1]" : "=r"(sample) : "r"(p_i2s_adc[0]));

                tempsample=bitrev(sample);
                /* Note the use ofreadBuffNo changes based on frameCount */
                if(buffIndex)0
                    samplesIn_1[i] = tempsample;//bitrev(sample);
                else
                    samplesIn_0[i] =tempsample;//bitrev(sample); 

            /* LR clock delayed byone clock, This is so MSB is output on the falling edge of BCLK
             * after the falling edge on which LRCLK wastoggled. (see I2S spec) */
                if(i==0)
                {
                   xscope_int(PLVALUE,tempsample);
                    p_lrclk <: 0x80000000;/* Generateclocks LR Clock low - LEFT */
                }
                else if(i==1)
                {
                   xscope_int(PRVALUE,tempsample);
                    p_lrclk <: 0x7FFFFFFF;/* Generate clocks LR Clock high - RIGHT */
                }
                p_i2s_dac[0] <: bitrev(samplesOut[i]);  //下一小節(jié):第四部分修改之處。

/* Clock out the LR Clock, the DAC data and Clock in the nextsample into ADC */
                doI2SClocks(divide);
            }  //end for(i=0;i<2;i++)
        }
         {
            /* Do samples transfer */
            /* The below looks a bit odd but forces thecompiler to inline twice */
            unsigned command;
            if(readBuffNo)
                command =DoSampleTransfer(c_out, 1, underflowWord);
            else
                command = DoSampleTransfer(c_out,0, underflowWord);

            if(command)
            {
                return command;
            }
            /* Reset frame counterand flip the ADC buffer */
            frameCount = 0;
            readBuffNo = !readBuffNo;
        }

四:從ADC獲取數(shù)據(jù)直接發(fā)給DAC醋奠,實(shí)現(xiàn)監(jiān)聽

將上面代碼中的這一句:

? p_i2s_dac[0] <:bitrev(samplesOut[i]);

改為:

? p_i2s_dac[0] <: bitrev(tempsample);//即用收到的數(shù)據(jù)直接放到I2S

實(shí)現(xiàn)監(jiān)聽榛臼,但須注意的是切換到聽歌狀態(tài)時(shí)伊佃,不能聽WAV歌曲,可以聽DSD讽坏,原因是聽歌狀態(tài)的DAC路徑被截?cái)嗔硕АT谡巾?xiàng)目時(shí)還需要改變成兩種狀態(tài)可切換。

五:連接android 華為手機(jī)

華為手機(jī)H60-l01路呜,Android 4.4.2迷捧,(1)支持OTG,(2)安裝海貝無損音樂播放器胀葱,用兩個(gè)小頭的USB連接后可以實(shí)現(xiàn)聽音樂功能漠秋。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市抵屿,隨后出現(xiàn)的幾起案子庆锦,更是在濱河造成了極大的恐慌,老刑警劉巖轧葛,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搂抒,死亡現(xiàn)場離奇詭異,居然都是意外死亡尿扯,警方通過查閱死者的電腦和手機(jī)求晶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衷笋,“玉大人芳杏,你說我怎么就攤上這事”僮冢” “怎么了爵赵?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長泊脐。 經(jīng)常有香客問我空幻,道長,這世上最難降的妖魔是什么容客? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任氛悬,我火速辦了婚禮,結(jié)果婚禮上耘柱,老公的妹妹穿的比我還像新娘如捅。我一直安慰自己,他們只是感情好调煎,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布镜遣。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪悲关。 梳的紋絲不亂的頭發(fā)上谎僻,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音寓辱,去河邊找鬼艘绍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛秫筏,可吹牛的內(nèi)容都是我干的诱鞠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼这敬,長吁一口氣:“原來是場噩夢啊……” “哼航夺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起崔涂,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤阳掐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后冷蚂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缭保,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年蝙茶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涮俄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡尸闸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出孕锄,到底是詐尸還是另有隱情吮廉,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布畸肆,位于F島的核電站宦芦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏轴脐。R本人自食惡果不足惜调卑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望大咱。 院中可真熱鬧恬涧,春花似錦、人聲如沸碴巾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疏遏。三九已至,卻和暖如春啤月,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背劳跃。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工谎仲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人刨仑。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓郑诺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親贸人。 傳聞我的和親對象是個(gè)殘疾皇子间景,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345