20151210:按照2ch-in,2ch-out,DSDout,修改的audioin_deliver()的部分内容

一:<略>

二:按照2ch-in,2ch-out,DSD out,修改的audioin_deliver()的部分内容

{
       #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

三:进一步的修改:去掉不必要的预编译,用循环代替类似段

(1)#pragma loop unroll命令,编译器在进行编译时,遇到该命令就会对循环进行展开。

由于已经去掉循环,因此可将这一条预编译命令去掉。

(2)#pragma xtaendpoint "i2s_output_r" ,xta是另一种芯片,带ARM核,因此可去掉。

(3)用循环表示左右声道的处理,将类似的两段代码写成一段,注意用#pragma loop unroll预编译指令展开

(4)用了两个数组(samplesIn_1[],samplesIn_0[])来存储录音数据,注意从I2S读入的是一个数组,而DoSampleTransfer中用的是另一个数组。

 {
            int i=0;
        #pragma loop unroll //预编译命令,将下面循环展开
            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]);  //下一小节:第四部分修改之处。

/* 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获取数据直接发给DAC,实现监听

将上面代码中的这一句:

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

改为:

​ p_i2s_dac[0] <: bitrev(tempsample);//即用收到的数据直接放到I2S

实现监听,但须注意的是切换到听歌状态时,不能听WAV歌曲,可以听DSD,原因是听歌状态的DAC路径被截断了。在正式项目时还需要改变成两种状态可切换。

五:连接android 华为手机

华为手机H60-l01,Android 4.4.2,(1)支持OTG,(2)安装海贝无损音乐播放器,用两个小头的USB连接后可以实现听音乐功能。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355