⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aaci_audio_ok.c

📁 此压缩包为杰得开发得z228的BSP的源代码,可以实现很多功能,尤其是视频解码有很好的效果.
💻 C
📖 第 1 页 / 共 5 页
字号:
        // Enable Receive
        AACI_RegWrite32( AACIReg_Channel1RxControl, 
			AACI_RegRead32(AACIReg_Channel1RxControl) | 
			AACIBit_EnableFIFO );
			
		
//if(lpFormat->nChannels == 1)
if(lpFormat->nChannels == 1)
		{

/*
		RETAILMSG(1,(TEXT("AACIReg_Channel1RxControl channel v10: %x \r\n") , 
		AACI_RegRead32(AACIReg_Channel1RxControl)));	
		
		AACI_RegWrite32( AACIReg_Channel1RxControl, 
		AACI_RegRead32(AACIReg_Channel1RxControl) |AACIBit_EnableFIFO ); 
		//AACIBit_EnableFIFO&(~0x10) );

		RETAILMSG(1,(TEXT("AACIReg_Channel1RxControl channel v10: %x \r\n") , 
		AACI_RegRead32(AACIReg_Channel1RxControl)& (~0x10)));	
*/

		AACI_RegWrite32( AACIReg_Channel1RxControl, 
		AACI_RegRead32(AACIReg_Channel1RxControl)& (~0x08) ); 
/*
		RETAILMSG(1,(TEXT("AACIReg_Channel1RxControl channel v11: %x \r\n") , 
		AACI_RegRead32(AACIReg_Channel1RxControl)));	
*/

		}

       else
       	{
/*
		RETAILMSG(1,(TEXT("AACIReg_Channel1RxControl channel 2: %x \r\n") , 
		AACI_RegRead32(AACIReg_Channel1RxControl)));
*/

		AACI_RegWrite32( AACIReg_Channel1RxControl, 
		AACI_RegRead32(AACIReg_Channel1RxControl) | 
		AACIBit_EnableFIFO|0x08 );	   	
/*
		RETAILMSG(1,(TEXT("AACIReg_Channel1RxControl channel 2: %x \r\n") , 
		AACI_RegRead32(AACIReg_Channel1RxControl)));
*/		
	       }
//#endif


		
		OnRecordOpen();
    }
EXIT:
    FUNC_WPDD("-AACI_WaveOpen");
//    OnOpen();
	//memset( MsgRecord , 0 , sizeof( MsgRecord ) );
	//KernelIoControl( IOCTL_HAL_FREE_DMA_SYSINTR +1 , 0 , 0 , 0 , 0 , 0 );
    return(mmRet);
}

// -----------------------------------------------------------------------------
//   VOID AACI_WaveClose(WAPI_INOUT apidir)
//
//   Closes the Wave Stream.
//   Sets the "In use" flag to FALSE;
// -----------------------------------------------------------------------------
VOID AACI_WaveClose(WAPI_INOUT apidir)
{
    FUNC_WPDD("AACI_WaveClose()");
	
	//RETAILMSG(yz_debug,(TEXT("AACI_WaveClose()\r\n")));
	
    if( apidir == WAPI_OUT )
    {
		OnPlayClose();
	}
	else
		OnRecordClose();
	/*
        VERBOSEMSG("AACI_WaveClose: WAPI_OUT");

	//yz_change
	p_n = 0;
        // Mute PCM and Line Level
        AACI_CodecWrite16( LM4549A_PCM_OUT_VOL, LM4549A_BIT_VOLUME_MUTE );
        AACI_CodecWrite16( LM4549A_LINE_LEV_OUT_VOL, LM4549A_BIT_VOLUME_MUTE );
    }
    else
    {
        VERBOSEMSG("AACI_WaveClose: WAPI_IN");

        // Mute input gain
        AACI_CodecWrite16( LM4549A_RECORD_GAIN, LM4549A_BIT_VOLUME_MUTE );
    }
*/
    g_pwfx[apidir]   = NULL;
    g_fInUse[apidir] = FALSE;
/*    
   if( MsgCount )
   	{
   		int i;
		for( i=0; i<MsgCount; i++ )
			RETAILMSG( 1 , (TEXT("physiaddr : %x , %x: \r\n") , MsgRecord[i][0] , MsgRecord[i][1]));
    }
*/    	
    //yz_add
    //fclose(DebugFile);
    
   //KernelIoControl( IOCTL_HAL_FREE_DMA_SYSINTR +2 , 0 , 0 , 0 , 0 , 0 );
//    OnClose();
    FUNC_WPDD("-AACI_WaveClose");
}

// -----------------------------------------------------------------------------
//  VOID AACI_WaveStart(WAPI_INOUT apidir, PWAVEHDR pwh)
//
//  Starts playback or record. Also called when overflow or underflow occurs to
//   re-synchoronise.
// -----------------------------------------------------------------------------
VOID AACI_WaveStart(WAPI_INOUT apidir, PWAVEHDR pwh)
{
    FUNC_WPDD("+AACI_WaveStart");

    // We are now running
    g_dwRunMode[apidir] = RUNMODE_RUNNING;

    // Start by assuming we have more data to send/get
    gv_fMoreData[apidir] = TRUE;	

	
    // Make sure the CODEC is on
    PowerUp();

#ifdef AACI_STATS
    g_dwBytesRecorded[apidir] = 0;
#endif    

    if( apidir == WAPI_OUT )
    {
        // We havn't got to the end yet!
        g_fTxEndOfData = FALSE;
        
        // Disable Transmit
        AACI_RegWrite32( AACIReg_Channel1TxControl, 
                        AACI_RegRead32(AACIReg_Channel1TxControl) & 
                        (~AACIBit_EnableFIFO) );

        // Fill up the FIFO
        (*pfnFillFIFO)(pwh);

        // Clear any interrupts
        AACI_RegWrite32( AACIReg_IntClear, AACIBit_TxUEC1 );	
   // Enable Transmit
        AACI_RegWrite32( AACIReg_Channel1TxControl, 
                        AACI_RegRead32(AACIReg_Channel1TxControl) | 
                        AACIBit_EnableFIFO );
        OnPlayStart();
    }
    else // (apidir == WAPI_IN)
    {
		// Disable Receive
        AACI_RegWrite32( AACIReg_Channel1RxControl, 
                        AACI_RegRead32(AACIReg_Channel1RxControl) & 
                        (~AACIBit_EnableFIFO) );

        // Clear any interrupts
        AACI_RegWrite32( AACIReg_IntClear, AACIBit_RxTOFEC1 | AACIBit_RxOEC1 );

        // Enable Receive
        AACI_RegWrite32( AACIReg_Channel1RxControl, 
                        AACI_RegRead32(AACIReg_Channel1RxControl) | 
                        AACIBit_EnableFIFO );
		OnRecordStart();
    }
    FUNC_WPDD("-AACI_WaveStart");
}

// -----------------------------------------------------------------------------
//  VOID AACI_WaveContinue (WAPI_INOUT apidir, PWAVEHDR pwh)
//
//  Continues playback or record, will be called straight after GetInterrupt
//   returns PLAYING or RECORDING status.
// -----------------------------------------------------------------------------
VOID AACI_WaveContinue (WAPI_INOUT apidir, PWAVEHDR pwh)
{
#if 0
    while( pwh != NULL && pwh->dwBytesRecorded >= pwh->dwBufferLength )
    {
        pwh = pwh->lpNext;
    }

	RETAILMSG(DBG_AACI,(TEXT("AACI_WaveContinue()\r\n")));

    if( pwh == NULL )
    {
        gv_fMoreData[apidir] = FALSE;
	RETAILMSG(DBG_AACI,(TEXT("AACI_WaveContinue() - NULL\r\n")));	
    }
    else
    {
        if (apidir == WAPI_OUT)
        {
            // Output these messages under test as they slow things down if 
            //  on most of the time
            TESTMSG("AACI_WaveContinue: WAPI_OUT");

		//yz_change for DMA
            //(*pfnFillFIFO)(pwh);
		
		//Disable Tx Interrupt	
		 AACI_RegWrite32( AACIReg_Channel1IntEnable, 
               	AACI_RegRead32( AACIReg_Channel1IntEnable ) & 
                	~(AACIBit_TxCIE | AACIBit_TxIE | AACIBit_TxUIE) );
		

            // Clear any transmit underruns now we have filled the FIFO
            if( AACI_RegRead32( AACIReg_Channel1Status ) & AACIBit_TXUnderrun )
            {
                TESTMSG("AACI_WaveContinue: Transmit Underrun - too slow!");
                AACI_RegWrite32( AACIReg_IntClear, AACIBit_TxUEC1 );
            }
			
        }
        else // (apidir == WAPI_IN)
        {
            TESTMSG("AACI_WaveContinue: WAPI_IN");
            (*pfnGetFIFO)(pwh);

            // Clear any receive overruns now we have emptied the FIFO
            if( AACI_RegRead32( AACIReg_Channel1Status ) & AACIBit_RXOverrun )
            {
                TESTMSG("AACI_WaveContinue: Receive Overrun - too slow!");
                AACI_RegWrite32( AACIReg_IntClear, AACIBit_RxOEC1 );
            }
        }
    }
#endif			
}

//-------------------------------------------------------
// VOID AACI_WaveEndOfData(WAPI_INOUT apidir)
//
//  Signals we have no more data to play 
//   (only called for WAPI_OUT).
//-------------------------------------------------------
VOID AACI_WaveEndOfData(WAPI_INOUT apidir)
{
#if 0
    FUNC_WPDD("+AACI_WaveEndOfData");

	RETAILMSG( yz_debug, (TEXT("AACI_WaveEndOfData()\r\n")));	
    if( apidir == WAPI_OUT )
    {
        g_fTxEndOfData = TRUE;

        // Once we get this, we won't be given any more data to play
        gv_fMoreData[WAPI_OUT] = FALSE;

        // Cause one final interrupt to make the driver return a STOPPED status
		DmaCmd = DMA_CMD_STOP;
        SetEvent( hAudioInterrupt );
    }
    
    FUNC_WPDD("-AACI_WaveEndOfData");
#endif
}

//-------------------------------------------------------
// VOID AACI_WaveStop(WAPI_INOUT apidir)
//
//  Stops the wave stream.
//-------------------------------------------------------
VOID AACI_WaveStop(WAPI_INOUT apidir)
{
	//FILE *f_in;
    FUNC_WPDD("+AACI_WaveStop");

	//RETAILMSG(yz_debug, (TEXT("AACI_WaveStop()\r\n")));
    // No more data to play
    gv_fMoreData[apidir] = FALSE;

    if( g_dwRunMode[apidir] != RUNMODE_STOPPED )
    {
        g_dwRunMode[apidir] = RUNMODE_STOPPED;

        if( apidir == WAPI_OUT )
        {
			OnPlayStop();
        	//yz_change for DMA
        /*	
            // Disable the AACI Transmit interrupts
            AACI_RegWrite32( AACIReg_Channel1IntEnable, 
                            AACI_RegRead32( AACIReg_Channel1IntEnable ) & 
                            ~(AACIBit_TxCIE | AACIBit_TxIE | AACIBit_TxUIE) );
*/
/*
				//yz_add for test
				f_in = fopen("\\windows\\hello_world.wav", "rb");				
				if(f_in == NULL)
					RETAILMSG(1, (TEXT("PDD_DMAThread() - file open FAILED!\r\n")));
				
				if((fread(total_buf, sizeof( char ), 200000, f_in)) != 200000)
					RETAILMSG(1, (TEXT("PDD_DMAThread() - file read Error! %d\r\n")));
				
				MMC_StartDMA(2, 0x10004090, total_buf, 200000);

				fclose(f_in);
				
				RETAILMSG(1, (TEXT("AACI_WaveStop(): File read done!\r\n")));
*/				
            if( !ClearTransmitFIFO() )
            {
                ERRMSG("AACI_WaveStop: Failed to clear Transmit FIFO");
            }

			RETAILMSG( DBG_AACI , (TEXT("aaci : stop\r\n")));
        }
        else // (apidir == WAPI_IN)
        {
            BOOL fCleared;
            
            // Disable the AACI Receive interrupts
            AACI_RegWrite32( AACIReg_Channel1IntEnable, 
                            AACI_RegRead32( AACIReg_Channel1IntEnable ) & 
                            ~(AACIBit_RxIE | AACIBit_RxOIE | 
                              AACIBit_RxTIE | AACIBit_RxTOIE) );

            // Clear the receive FIFO
            fCleared = ClearReceiveFIFO(NULL);

            if( !fCleared )
            {
                ERRMSG("AACI_WaveStop: Failed to clear Receive FIFO");
            }
			OnRecordStop();
        }
    }

    FUNC_WPDD("-AACI_WaveStop");
}

// -----------------------------------------------------------------------------
//  VOID AACI_Standby (WAPI_INOUT apidir)
//
//   Called between playing sounds to save power
// -----------------------------------------------------------------------------
VOID AACI_Standby(WAPI_INOUT apidir)
{
    FUNC_WPDD("+AACI_Standby");

	// Make sure we have stopped
    AACI_WaveStop(apidir);


    if( (g_dwRunMode[WAPI_OUT] == RUNMODE_STOPPED) && 
        (g_dwRunMode[WAPI_IN] == RUNMODE_STOPPED) )
    {
        // Power down device
        PowerDown();
    }
	RETAILMSG( DBG_AACI, (TEXT("aaci : standby\r\n")));
    FUNC_WPDD("-AACI_Standby");
}

//---------------------------------------------------------
//  VOID AACI_Deinitialize(VOID)
//
//  This routine is called when the driver
//  is being unloaded. Free up memory, etc.
//---------------------------------------------------------
VOID AACI_Deinitialize(VOID)
{
    FUNC_WPDD("+AACI_Deinitialize");

    if( g_AudioRegBase )
    {
        // Disable AACI functionality
        AACI_RegWrite32( AACIReg_MainControl, 0 );

        // Unmap hardware register space
        MmUnmapIoSpace( g_AudioRegBase, AACI_HWREGS_SIZE );
    }
	OnDeinit();
    FUNC_WPDD("-AACI_Deinitialize");
}

//---------------------------------------------------------
//   ULONG AACI_GetVolume(VOID)
//
//   Returns the digital volume to the caller
//---------------------------------------------------------
ULONG AACI_GetVolume(VOID)
{
RETAILMSG( DBG_AACI, (TEXT("AACI_GetVolume()\r\n")));	
    MISC1("AACI_GetVolume: 0x%08x", g_nVolume);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -