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

📄 audio.c

📁 windows ce 下ARM9音频驱动代码
💻 C
📖 第 1 页 / 共 4 页
字号:
DEBUGMSG(1, (TEXT("** WaveResource->WaveHeader             0x%8.8X\r\n"), WaveResource->WaveHeader));
if (WaveResource->WaveHeader) DEBUGMSG(1, (TEXT("** WaveResource->WaveHeader->lpData             0x%8.8X\r\n"), WaveResource->WaveHeader->lpData));
DEBUGMSG(1, (TEXT("** WaveResource->WaveFormat             0x%8.8X\r\n"), WaveResource->WaveFormat));
DEBUGMSG(1, (TEXT("** WaveResource->WaveDirection          0x%8.8X\r\n"), WaveResource->WaveDirection));
DEBUGMSG(1, (TEXT("** WaveResource->MoreData               0x%8.8X\r\n"), WaveResource->MoreData));
DEBUGMSG(1, (TEXT("\r\n")));
DEBUGMSG(1, (TEXT("** WaveResource->DmaRegPtr->Control     0x%8.8X\r\n"), WaveResource->DmaRegPtr->Control));
DEBUGMSG(1, (TEXT("** WaveResource->DmaRegPtr->Status      0x%8.8X\r\n"), WaveResource->DmaRegPtr->Status));
DEBUGMSG(1, (TEXT("** WaveResource->DmaRegPtr->Remain      0x%8.8X\r\n"), WaveResource->DmaRegPtr->Remain));
DEBUGMSG(1, (TEXT("** WaveResource->DmaRegPtr->MaxCnt0     0x%8.8X\r\n"), WaveResource->DmaRegPtr->MaxCnt0));
DEBUGMSG(1, (TEXT("** WaveResource->DmaRegPtr->Base0       0x%8.8X\r\n"), WaveResource->DmaRegPtr->Base0));
DEBUGMSG(1, (TEXT("** WaveResource->DmaRegPtr->Current0    0x%8.8X\r\n"), WaveResource->DmaRegPtr->Current0));
DEBUGMSG(1, (TEXT("** WaveResource->DmaRegPtr->MaxCnt1     0x%8.8X\r\n"), WaveResource->DmaRegPtr->MaxCnt1));
DEBUGMSG(1, (TEXT("** WaveResource->DmaRegPtr->Base1       0x%8.8X\r\n"), WaveResource->DmaRegPtr->Base1));
DEBUGMSG(1, (TEXT("** WaveResource->DmaRegPtr->Current1    0x%8.8X\r\n"), WaveResource->DmaRegPtr->Current1));
DEBUGMSG(1, (TEXT("\r\n")));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACDR1        0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACDR1));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACRXCR1      0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACRXCR1));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACTXCR1      0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACTXCR1));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACSR1        0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACSR1));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACRISR1      0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACRISR1));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACISR1       0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACISR1));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACIE1        0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACIE1));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->Reserved1     0x%8.8X\r\n"), WaveDevice->AacRegPtr->Reserved1));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACDR2        0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACDR2));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACRXCR2      0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACRXCR2));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACTXCR2      0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACTXCR2));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACSR2        0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACSR2));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACRISR2      0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACRISR2));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACISR2       0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACISR2));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACIE2        0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACIE2));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->Reserved2     0x%8.8X\r\n"), WaveDevice->AacRegPtr->Reserved2));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACDR3        0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACDR3));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACRXCR3      0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACRXCR3));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACTXCR3      0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACTXCR3));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACSR3        0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACSR3));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACRISR3      0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACRISR3));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACISR3       0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACISR3));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACIE3        0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACIE3));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->Reserved3     0x%8.8X\r\n"), WaveDevice->AacRegPtr->Reserved3));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACDR4        0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACDR4));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACRXCR4      0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACRXCR4));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACTXCR4      0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACTXCR4));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACSR4        0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACSR4));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACRISR4      0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACRISR4));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACISR4       0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACISR4));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACIE4        0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACIE4));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->Reserved4     0x%8.8X\r\n"), WaveDevice->AacRegPtr->Reserved4));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACS1DATA     0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACS1DATA));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACS2DATA     0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACS2DATA));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACS12DATA    0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACS12DATA));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACRGIS       0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACRGIS));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACGIS        0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACGIS));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACIM         0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACIM));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACEOI        0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACEOI));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACGCR        0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACGCR));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACRESET      0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACRESET));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACSYNC       0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACSYNC));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACGCIS       0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACGCIS));

DEBUGMSG(1, (TEXT("*************************************** WaveOpen()\r\n")));
DEBUGMSG(1, (TEXT("\r\n")));




ErrorReturn:

    return ReturnValue;
}


static
MMRESULT
WaveClose(
    IN OUT PWAVE_RESOURCE WaveResource
    )

/*++

Routine Description:

    Closes a wave stream.  This routine is dispatched by PDD_WaveProc.  It is
    expected that for every call to WaveOpen that succeeds, there will be one
    and only one call to this routine.

Arguments:

    WaveResource - Pointer to the wave resources structure corresponding to
        the stream to be closed.

Return Value:

    Returns an MMRESULT.  MMSYSERR_NOERROR is returned on success.

--*/

{
    MMRESULT ReturnValue;

    DEBUGMSG(1, (TEXT("WaveClose:\r\n")));

    ReturnValue = MMSYSERR_ERROR;

    //
    // Verify that the resource was allocated and deallocate it by marking it
    // as unused.
    //
    if (WaveResource->InUse == TRUE) {

        if( WaveResource->WaveDirection == WAPI_OUT) 
            WaitForDmaComplete(WaveResource);

        WaveResource->InUse = FALSE;
    }
    else {

        DEBUGMSG(1, (TEXT("WaveClose: Tried to close unallocated stream.\r\n")));
        goto ErrorReturn;
    }

    ReturnValue = MMSYSERR_NOERROR;

ErrorReturn:

    return ReturnValue;
}


static
VOID 
WaveStandby(
    IN OUT PWAVE_RESOURCE WaveResource
    )

/*++

Routine Description:

    Powers down the devices associated with the specified direction.  This is
    dispatched by PDD_WaveProc.  The MDD will call into PDD_WaveProc to have
    this routine run when either of the AUDIO_STATE_OUT_STOPPED or
    AUDIO_STATE_IN_STOPPED flags are returned.

Arguments:

    WaveResource - Pointer to the wave resouces structure corresponding to the
        wave stream that is to be placed in standby.

Return Value:

    None.

--*/

{
    ShutdownDma(WaveResource);
    ClearDmaStatus(WaveResource);
}


//
// Exported Routines (PDD Interface).
//

AUDIO_STATE 
PDD_AudioGetInterruptType(
    VOID
    )
{
    AUDIO_STATE PendingInterrupts = 0;
    ULONG Interrupt;
    ULONG CurState = 0;
    ULONG NextBuf = 0;
    ULONG Status;
    BOOLEAN DmaInterrupt;

    DMA_CHANNEL_REG* OutputDmaRegPtr;
    DMA_CHANNEL_REG* InputDmaRegPtr;

    OutputDmaRegPtr = WaveDevice->DmaCtrlOutput;
    InputDmaRegPtr = WaveDevice->DmaCtrlInput;

    //
    // For each of input and output, read the DMA status registers to see if
    // there is a pending interrupt.  Depending on whether or not there is a
    // pending interrupt and if there is more data to play/record, various
    // flags are ORed into the audio state to be returned to the MDD.
    //

    //
    // Wave Input
    //
    Interrupt = READ_REGISTER_ULONG(&InputDmaRegPtr->Status);
   
	CurState = (Interrupt >> 4) & 0x3;
    NextBuf  = (Interrupt >> 6) & 0x1;
    Interrupt = Interrupt & (DMA_INT_STALLINT | DMA_INT_NFBINT | DMA_INT_CHERRINT);
    DmaInterrupt = (Interrupt) ? TRUE : FALSE;

    Status = READ_REGISTER_ULONG(&InputDmaRegPtr->Status);

#if 1
    if ( DmaInterrupt )         {
        DEBUGMSG(1, (TEXT("GetIntType:In: Interrupt=%X Status=%X CurState=0x%x NextBuf=0x%x\r\n"),Interrupt,Status,CurState,NextBuf));

        WaveInResource->NextDMABuf = NextBuf;
        // Clear the interrupt register
        WRITE_REGISTER_ULONG(&InputDmaRegPtr->Interrupt, Interrupt);
        Drv_AHBBus_ExtraWrite();
   
        // Wave input interrupt has occurred 

        if (Interrupt & DMA_STATUS_STALL) {
            if( WaveInResource->MoreData ) {
                DEBUGMSG(1, (TEXT("GetIntType: WaveIn DMA OVERFLOW\r\n")));
                PendingInterrupts |= AUDIO_STATE_IN_OVERFLOW;
            }
            else {
                //
                // Higher layer has stopped recording, switch off DMAs
                // indicate new audio state as stopped
                //
                DEBUGMSG(1, (TEXT("GetIntType: WavIn stopped\r\n")));
                PendingInterrupts |= AUDIO_STATE_IN_STOPPED;
                WRITE_REGISTER_ULONG(&InputDmaRegPtr->Control, 0 );
				Drv_AHBBus_ExtraWrite();

            } // endif( WaveInResource->MoreData )
        }
        else {
            if( WaveInResource->MoreData )
			{
			    //
				// More data wanted, so keep recording
				//
			   DEBUGMSG(1, (TEXT("GetIntType: WavIn more data.\r\n")));
			   PendingInterrupts |= AUDIO_STATE_IN_RECORDING;
			} // endif( WaveInResource->MoreData )
            else 
			{
                //
                // Higher layer has stopped recording, switch off DMAs
                // indicate new audio state as stopped
                //
                DEBUGMSG(1, (TEXT("GetIntType: WavIn stopped\r\n")));
                PendingInterrupts |= AUDIO_STATE_IN_STOPPED;
                WRITE_REGISTER_ULONG(&InputDmaRegPtr->Control, 0 );
				Drv_AHBBus_ExtraWrite();

            } // endif( WaveInResource->MoreData )


        } // endif (Interrupt & DMA_STATUS_STALL)

        goto ReturnWaveStatus;
    } // endif( DmaInterrupt ) Wave Input
#endif

    //
    // Wave output.
    //
    Interrupt = READ_REGISTER_ULONG(&OutputDmaRegPtr->Status);
    CurState = (Interrupt >> 4) & 0x3;
    NextBuf  = (Interrupt >> 6) & 0x1;
    DmaInterrupt = (Interrupt & (DMA_INT_STALLINT | DMA_INT_NFBINT | DMA_INT_CHERRINT)) ? TRUE : FALSE;
    Status = READ_REGISTER_ULONG(&OutputDmaRegPtr->Status);

#ifdef NOAUDIODMA
    if (WaveOutResource->MoreData == TRUE) {
        DEBUGMSG(1, (TEXT("GetIntType: playing (PIO)\r\n")));
        PendingInterrupts |= AUDIO_STATE_OUT_PLAYING;
    }
    else {
        DEBUGMSG(1, (TEXT("GetIntType: stopped (PIO)\r\n")));
        PendingInterrupts |= AUDIO_STATE_OUT_STOPPED;
    }

//  WaveOutResource->NextDMABuf ^= 1;

#else
    if (DmaInterrupt) {

#if 0
        if (NextBuf == 0) {
            DEBUGMSG(1, (TEXT("GIT:0:0x%x\r\n"),Cur    State));

        }
        else {
            DEBUGMSG(1, (TEXT("GIT:1:0x%x\r\n"),CurState));

        }
#endif

        DEBUGMSG(1, (TEXT("GetIntType:Out: CurState=0x%x NextBuf=0x%x\r\n"),CurState,NextBuf));

        WaveOutResource->NextDMABuf = NextBuf;

        // Clear the interrupt register
        WRITE_REGISTER_ULONG(&OutputDmaRegPtr->Interrupt, Interrupt);
	    Drv_AHBBus_ExtraWrite();

        //
        // This is a wave output interrupt.
        //
        if (Interrupt & DMA_STATUS_CHERR) {
            //
            // If the error bit is set, something really bad happened.  There
            // isn't much we can do here, so just clear the error and hope
            // things work from here out.
            //
            DEBUGMSG(1, (TEXT("GetIntType: WavOut DMA ERROR\r\n")));
        } // endif (Interrupt & DMA_STATUS_CHERR)

        if (Interrupt & DMA_STATUS_STALL)       {
            //
            // The DMA registers have been dealt with.  Now figure out what flags
            // to return to the MDD's IST so it can dispatch routines to handle
            // the interrupt.
            //
            if (WaveOutResource->MoreData == TRUE) {
                //
                // Both DMA channels emptied and we didn't keep up, causing an
                // underflow condition.  Both done bits are cleared and the
                // AUDIO_STATE_OUT_UNDERFLOW flag is returned to the MDD.  The
                // MDD will call into WaveProc with WPDM_START.  This will restart
                // the wave stream and perform all necessary resynchronization.
                // 
                DEBUGMSG(1, (TEXT("GetIntType:WavOut playing\r\n")));
                PendingInterrupts |= AUDIO_STATE_OUT_PLAYING;
            }
            else {
                // The DMA counters are zero, so they're not playing anymore.
                //
                DEBUGMSG(1, (TEXT("GetIntType:WavOut stopped\r\n")));
                PendingInterrupts |= AUDIO_STATE_OUT_STOPPED;
            } // endif (WaveOutResource->MoreData == TRUE)
                }
        else {
            //
            // There is still more data, so we need to keep playing.
            //
            DEBUGMSG(1, (TEXT("GetIntType:WavOut more data\r\n")));
            PendingInterrupts |= AUDIO_STATE_OUT_PLAYING;
        }  //endif (Interrupt & DMA_STATUS_STALL)

        goto ReturnWaveStatus;
        } // endif( DmaInterrupt ) Wave Output

ReturnWaveStatus:
#endif

    Drv_AHBBus_ExtraWrite();

    return PendingInterrupts;
}


DWORD
PDD_AudioMessage(
    UINT Message,
    ULONG Param1,
    ULONG Param2
    )
{
    return MMSYSERR_NOTSUPPORTED;
}


BOOL 
PDD_AudioInitialize (
    ULONG Index
    )
{
    BOOL RoutineSuccess;
    BOOLEAN Success;
    PHYSICAL_ADDRESS PhysAddr;
    ULONG BufferOffset;

    RoutineSuccess = FALSE;

    DEBUGMSG(1, (TEXT("PDD_AudioInitialize. \r\n")));
	
    //
    // Allocate a configuration structure to hold our configuration
    // information for this wave device instance.
    //
    WaveDevice = LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT,
                            sizeof(*WaveDevice));

    if (WaveDevice == NULL) {

        DEBUGMSG(1, (TEXT("PDD_AudioInitialize: Failed to allocate configuration structure\r\n")));

        SetLastError(ERROR_NOT_ENOUGH_MEMORY);
        goto ErrorReturn;
    }

    //
    // Initialize the critical section object.
    //

    InitializeCriticalSection(&WaveDevice->Cs);

    //
    // Read in the configuration values.
    //
    WaveDevice->DmaChannelInput  = DMA_CHANNEL_AAC0_RX;  // Use AAC-0
    WaveDevice->DmaChannelOutput = DMA_CHANNEL_AAC0_TX;

    WaveDevice->DmaBufferSize = DMA_BUFFER_SIZE;

    //
    // Map in the APB Clock Control Registers
    //

    PhysAddr.QuadPart = APB_CLK_STATE_CTL_REGS_BASE;

    WaveDevice->ABPClkCtrlRegPrt = MmMapIoSpace(PhysAddr,
                                                sizeof(*WaveDevice->ABPClkCtrlRegPrt),
                                                FALSE);

    if (WaveDevice->ABPClkCtrlRegPrt == NULL) {

        DEBUGMSG(1, (TEXT("PDD_AudioInitialize: Unable to map APB Clock Control Registers\r\n")));

        SetLastError(ERROR_NOT_ENOUGH_MEMORY);
        goto ErrorReturn;
    }

    //
    // Map in the AAC registers.
    //
    PhysAddr.QuadPart = APB_AAC_REGS_BASE;

    WaveDevice->AacRegPtr = MmMapIoSpace(PhysAddr,
                                         sizeof(*WaveDevice->AacRegPtr),
                                         FALSE);

    if (WaveDevice->AacRegPtr == NULL) {

        DEBUGMSG(1, (TEXT("PDD_AudioInitialize: Unable to map AAC\r\n")));

        SetLastError(ERROR_NOT_ENOUGH_MEMORY);
        goto ErrorReturn;
    }

⌨️ 快捷键说明

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