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

📄 waveout.c

📁 windows ce 下ARM9音频驱动代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    return MMSYSERR_NOERROR;
}


VOID
WaveOutStart(
    IN OUT PWAVE_RESOURCE WaveResource,
    IN OUT PWAVEHDR WaveHeader
    )

/*++

Routine Description:

    This routine handles set up of a new wave output stream.

Arguments:

    WaveResource - Pointer to the wave resource structure corresponding to the
        stream to be started.

    WaveHeader - Pointer to the wave header information.

Return Value:

    None.

--*/

{
    DMA_CHANNEL_REG* DmaRegPtr;
    PULONG NextBuffer;
    ULONG FillAmount;
    ULONG SamplesPerSecond;
    ULONG SamplesRateValue;
    APB_AAC_REGS* AacRegPtr = WaveResource->AacRegPtr;

    SamplesPerSecond = WaveResource->WaveFormat.nSamplesPerSec;

    //
    // Setup the Sample per second rate
    //
    switch (SamplesPerSecond) {

    case 8000:
        SamplesRateValue = 0x1F40;
        break;

    case 11025:
        SamplesRateValue = 0x2B11;
        break;

    case 22050:
        SamplesRateValue = 0x5622;
        break;

    case 44100:
        SamplesRateValue = 0xAC44;
        break;

    default:
        DEBUGMSG(1, (TEXT("WaveOutStart: Unsupported sample rate %u.\r\n"), SamplesPerSecond));
        break;
    }  // end switch (SamplesPerSecond)


    DEBUGMSG(1, (
        TEXT("WaveOutStart:")
        TEXT("Len=%u Recorded=%u bits=%u Stereo=%u Rate=%u RateValue=0x%x\r\n"),
        WaveHeader->dwBufferLength,
        WaveHeader->dwBytesRecorded,
        WaveResource->WaveFormat.wBitsPerSample,
        WaveResource->WaveFormat.nChannels,
        SamplesPerSecond,
        SamplesRateValue));

    if (AAC_WriteCODECIndexRegister (AacRegPtr, AC97_PCM_FRONT_DAC_RATE, SamplesRateValue) == FALSE) {
        RETAILMSG(1, (TEXT("WaveOutStart: Set sample rate failed-1\r\n")));
    }

#if 0
{
    ULONG   val;

    val = AAC_ReadCODECIndexRegister(AacRegPtr, AC97_PCM_FRONT_DAC_RATE);

    if (val != SamplesRateValue) {
        RETAILMSG(1,(TEXT("WaveOutStart: SamplesRateValue setup failed (0x%x != 0x%x)\r\n"),
                     SamplesRateValue,val));
    }
    else {
        RETAILMSG(1,(TEXT("WaveOutStart: SamplesRateValue verified (0x%x = 0x%x)\r\n"),
                     SamplesRateValue,val));
    }
}
#endif

    DmaRegPtr = WaveResource->DmaRegPtr;

    //
    // Mark the stream as having more data.
    //
    WaveResource->MoreData = TRUE;

    //
    // Ensure the DMA channel is off and any status bits are cleared.
    //
    ShutdownDma(WaveResource);
    ClearDmaStatus(WaveResource);

    WaveResource->NextDMABuf = 0;

    //
    // Initialize the transfer counts to 0.
    //
    WRITE_REGISTER_ULONG(&DmaRegPtr->MaxCnt0, 0);
    WRITE_REGISTER_ULONG(&DmaRegPtr->MaxCnt1, 0);

    WaveResource->BufferAPhysAddr.LowPart = 0;
    WaveResource->BufferBPhysAddr.LowPart = 0;

    //
    // Store a copy of the specified wave header pointer into the resource
    // structure.
    //
    WaveResource->WaveHeader = WaveHeader;


#ifdef NOAUDIODMA
    DEBUGMSG(1, (TEXT("WaveOutStart: Using Polling\r\n")));

    NextBuffer = GetNextDmaBuffer(WaveResource);

    while( (FillAmount = FillDmaBuffer(WaveResource, (PUCHAR) NextBuffer)) ) {

        DEBUGMSG(1, (TEXT("WaveOutStart: FillAmount-1=%u\r\n"),FillAmount));

        SetBufferSize(WaveResource, NextBuffer, FillAmount);
        AudioDataSend(WaveResource, NextBuffer, FillAmount);
        NextBuffer = GetNextDmaBuffer(WaveResource);
    }

#else
    // prime the DMA with padded zero data

    // FillAmount = WaveResource->DmaBufferSize;

//*TSAT* 18-Apr-2002 SetBufferSize() not called again.
//                   If we set here to 256, that's where the buffer stays.
//    FillAmount = 0x100;		// use a smaller one will introduce smaller delay
    FillAmount = WaveResource->DmaBufferSize;

    NextBuffer = GetNextDmaBuffer(WaveResource);
    DEBUGMSG(1,(TEXT("FillDMABuffer=A\r\n")));    
    memset((void*)NextBuffer, 0, FillAmount);
    SetBufferSize(WaveResource, NextBuffer, FillAmount);
    MapTransfer(TRUE, WaveResource, NextBuffer);
    InitiateDma(WaveResource);
    StartDmaOut(WaveResource);
//*TSAT* 18-Apr-2002 Starting buffer B is unnecessary.
//* As soon as we start buffer A, it is interrupted telling us we can load buffer B.
    NextDmaBuffer(WaveResource);
    NextBuffer = GetNextDmaBuffer(WaveResource);
    DEBUGMSG(1,(TEXT("FillDMABuffer=B\r\n")));
    memset((void*)NextBuffer, 0, FillAmount);
    SetBufferSize(WaveResource, NextBuffer, FillAmount);
    MapTransfer(TRUE, WaveResource, NextBuffer);
//*TSAT* 18-Apr-2002. Artificially zero out DmaBufferBBytes to keep buffer b from starting.
// Restore NextBuffer index.
    WaveResource->DmaBufferBBytes = FillAmount;
    DEBUGMSG(1, (TEXT("WaveOutStart: Starting DMA.\r\n")));

#endif NOAUDIODMA
    StartDmaOut(WaveResource);



#if 0
DEBUGMSG(1, (TEXT("\r\n")));
DEBUGMSG(1, (TEXT("*************************************** WaveOutStart()\r\n")));
DEBUGMSG(1, (TEXT("** &WaveResource                        0x%8.8X\r\n"), &WaveResource));
DEBUGMSG(1, (TEXT("** WaveResource                         0x%8.8X\r\n"), WaveResource));
DEBUGMSG(1, (TEXT("** WaveResource->SysIntr                0x%8.8X\r\n"), WaveResource->SysIntr));
DEBUGMSG(1, (TEXT("** WaveResource->DmaBufferSize          0x%8.8X\r\n"), WaveResource->DmaBufferSize));
DEBUGMSG(1, (TEXT("** WaveResource->AdapterObject          0x%8.8X\r\n"), WaveResource->AdapterObject));
DEBUGMSG(1, (TEXT("** WaveResource->MapRegsBase            0x%8.8X\r\n"), WaveResource->MapRegsBase));
DEBUGMSG(1, (TEXT("** WaveResource->DmaBufferMdl           0x%8.8X\r\n"), WaveResource->DmaBufferMdl));
DEBUGMSG(1, (TEXT("** WaveResource->StartBuffer            0x%8.8X\r\n"), WaveResource->StartBuffer));
DEBUGMSG(1, (TEXT("** WaveResource->BufferAPhysAddr        0x%8.8X\r\n"), WaveResource->BufferAPhysAddr));
DEBUGMSG(1, (TEXT("** WaveResource->DmaBufferA             0x%8.8X\r\n"), WaveResource->DmaBufferA));
DEBUGMSG(1, (TEXT("** WaveResource->DmaBufferABytes        0x%8.8X\r\n"), WaveResource->DmaBufferABytes));
DEBUGMSG(1, (TEXT("** WaveResource->BufferBPhysAddr        0x%8.8X\r\n"), WaveResource->BufferBPhysAddr));
DEBUGMSG(1, (TEXT("** WaveResource->DmaBufferB             0x%8.8X\r\n"), WaveResource->DmaBufferB));
DEBUGMSG(1, (TEXT("** WaveResource->DmaBufferBBytes        0x%8.8X\r\n"), WaveResource->DmaBufferBBytes));
DEBUGMSG(1, (TEXT("** WaveResource->NextDMABuf             0x%8.8X\r\n"), WaveResource->NextDMABuf));
DEBUGMSG(1, (TEXT("** WaveResource->ABPClkCtrlRegPrt       0x%8.8X\r\n"), WaveResource->ABPClkCtrlRegPrt));
DEBUGMSG(1, (TEXT("** WaveResource->AacRegPtr              0x%8.8X\r\n"), WaveResource->AacRegPtr));
DEBUGMSG(1, (TEXT("** WaveResource->AHBDmaCtrlRegPtr       0x%8.8X\r\n"), WaveResource->AHBDmaCtrlRegPtr));
DEBUGMSG(1, (TEXT("** WaveResource->DmaRegPtr              0x%8.8X\r\n"), WaveResource->DmaRegPtr));
DEBUGMSG(1, (TEXT("** WaveResource->InUse                  0x%8.8X\r\n"), WaveResource->InUse));
DEBUGMSG(1, (TEXT("** WaveResource->WaveHeader             0x%8.8X\r\n"), WaveResource->WaveHeader));
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("** WaveHeader->lpData                   0x%8.8X\r\n"), WaveHeader->lpData));
DEBUGMSG(1, (TEXT("** WaveHeader->dwBufferLength           0x%8.8X\r\n"), WaveHeader->dwBufferLength));
DEBUGMSG(1, (TEXT("** WaveHeader->dwBytesRecorded          0x%8.8X\r\n"), WaveHeader->dwBytesRecorded));
DEBUGMSG(1, (TEXT("** WaveHeader->dwUser                   0x%8.8X\r\n"), WaveHeader->dwUser));
DEBUGMSG(1, (TEXT("** WaveHeader->dwFlags                  0x%8.8X\r\n"), WaveHeader->dwFlags));
DEBUGMSG(1, (TEXT("** WaveHeader->dwLoops                  0x%8.8X\r\n"), WaveHeader->dwLoops));
DEBUGMSG(1, (TEXT("** WaveHeader->lpNext                   0x%8.8X\r\n"), WaveHeader->lpNext));
DEBUGMSG(1, (TEXT("*************************************** WaveOutStart()\r\n")));
DEBUGMSG(1, (TEXT("\r\n")));
#endif


    return;
}


VOID
WaveOutContinue (
    IN OUT PWAVE_RESOURCE WaveResource,
    IN OUT PWAVEHDR WaveHeader
    )

/*++

Routine Description:

    This routine handles continuation of a playing audio output stream.
    The operations are similar to starting wave output.

Arguments:

    WaveHeader - Pointer to the wave header information.

Return Value:

    None.

--*/

{
    PULONG NextBuffer;
    ULONG FillAmount;
    WaveResource->WaveHeader = WaveHeader;
    NextBuffer = GetNextDmaBuffer(WaveResource);
    FillAmount = FillDmaBuffer(WaveResource, (PUCHAR) NextBuffer);
    SetBufferSize(WaveResource, NextBuffer, FillAmount);

//  DEBUGMSG(1, (TEXT("WaveOutContinue: FillAmount=%u\r\n"),FillAmount));
    DEBUGMSG(1, (TEXT("WaveOutContinue: FillAmount=%u to Buffer Base%u\r\n"),
                 FillAmount, WaveResource->NextDMABuf));

    if (FillAmount != 0) {
#ifdef NOAUDIODMA
        DEBUGMSG(1, (TEXT("WaveOutContinue: Using Polling\r\n")));
        AudioDataSend(WaveResource, NextBuffer, FillAmount);
#else
        DEBUGMSG(1, (TEXT("WaveOutContinue: Using DMA\r\n")));
        MapTransfer(FALSE, WaveResource, NextBuffer);
#endif
        StartDmaOut(WaveResource);
    }
    else {
        WaveResource->MoreData = FALSE;
#ifdef NOAUDIODMA
        DEBUGMSG(1, (TEXT("WaveOutContinue: No more data\r\n")));
#endif
        StartDmaOut(WaveResource);
    }


#if 0
DEBUGMSG(1, (TEXT("\r\n")));
DEBUGMSG(1, (TEXT("*************************************** WaveOutContinue()\r\n")));
DEBUGMSG(1, (TEXT("** &WaveResource                        0x%8.8X\r\n"), &WaveResource));
DEBUGMSG(1, (TEXT("** WaveResource                         0x%8.8X\r\n"), WaveResource));
DEBUGMSG(1, (TEXT("** WaveResource->SysIntr                0x%8.8X\r\n"), WaveResource->SysIntr));
DEBUGMSG(1, (TEXT("** WaveResource->DmaBufferSize          0x%8.8X\r\n"), WaveResource->DmaBufferSize));
DEBUGMSG(1, (TEXT("** WaveResource->AdapterObject          0x%8.8X\r\n"), WaveResource->AdapterObject));
DEBUGMSG(1, (TEXT("** WaveResource->MapRegsBase            0x%8.8X\r\n"), WaveResource->MapRegsBase));
DEBUGMSG(1, (TEXT("** WaveResource->DmaBufferMdl           0x%8.8X\r\n"), WaveResource->DmaBufferMdl));
DEBUGMSG(1, (TEXT("** WaveResource->StartBuffer            0x%8.8X\r\n"), WaveResource->StartBuffer));
DEBUGMSG(1, (TEXT("** WaveResource->BufferAPhysAddr        0x%8.8X\r\n"), WaveResource->BufferAPhysAddr));
DEBUGMSG(1, (TEXT("** WaveResource->DmaBufferA             0x%8.8X\r\n"), WaveResource->DmaBufferA));
DEBUGMSG(1, (TEXT("** WaveResource->DmaBufferABytes        0x%8.8X\r\n"), WaveResource->DmaBufferABytes));
DEBUGMSG(1, (TEXT("** WaveResource->BufferBPhysAddr        0x%8.8X\r\n"), WaveResource->BufferBPhysAddr));
DEBUGMSG(1, (TEXT("** WaveResource->DmaBufferB             0x%8.8X\r\n"), WaveResource->DmaBufferB));
DEBUGMSG(1, (TEXT("** WaveResource->DmaBufferBBytes        0x%8.8X\r\n"), WaveResource->DmaBufferBBytes));
DEBUGMSG(1, (TEXT("** WaveResource->NextDMABuf             0x%8.8X\r\n"), WaveResource->NextDMABuf));
DEBUGMSG(1, (TEXT("** WaveResource->ABPClkCtrlRegPrt       0x%8.8X\r\n"), WaveResource->ABPClkCtrlRegPrt));
DEBUGMSG(1, (TEXT("** WaveResource->AacRegPtr              0x%8.8X\r\n"), WaveResource->AacRegPtr));
DEBUGMSG(1, (TEXT("** WaveResource->AHBDmaCtrlRegPtr       0x%8.8X\r\n"), WaveResource->AHBDmaCtrlRegPtr));
DEBUGMSG(1, (TEXT("** WaveResource->DmaRegPtr              0x%8.8X\r\n"), WaveResource->DmaRegPtr));
DEBUGMSG(1, (TEXT("** WaveResource->InUse                  0x%8.8X\r\n"), WaveResource->InUse));
DEBUGMSG(1, (TEXT("** WaveResource->WaveHeader             0x%8.8X\r\n"), WaveResource->WaveHeader));
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("** WaveHeader->lpData                   0x%8.8X\r\n"), WaveHeader->lpData));
DEBUGMSG(1, (TEXT("** WaveHeader->dwBufferLength           0x%8.8X\r\n"), WaveHeader->dwBufferLength));
DEBUGMSG(1, (TEXT("** WaveHeader->dwBytesRecorded          0x%8.8X\r\n"), WaveHeader->dwBytesRecorded));
DEBUGMSG(1, (TEXT("** WaveHeader->dwUser                   0x%8.8X\r\n"), WaveHeader->dwUser));
DEBUGMSG(1, (TEXT("** WaveHeader->dwFlags                  0x%8.8X\r\n"), WaveHeader->dwFlags));
DEBUGMSG(1, (TEXT("** WaveHeader->dwLoops                  0x%8.8X\r\n"), WaveHeader->dwLoops));
DEBUGMSG(1, (TEXT("** WaveHeader->lpNext                   0x%8.8X\r\n"), WaveHeader->lpNext));
DEBUGMSG(1, (TEXT("*************************************** WaveOutContinue()\r\n")));
DEBUGMSG(1, (TEXT("\r\n")));
#endif

    return;
}


VOID
WaveOutEndOfData(
    IN OUT PWAVE_RESOURCE WaveResource
    )

/*++

Routine Description:

    This routine handles clean up of audio output when the wave
    output stream has ended.  It stops any output DMA transfer
    in progress and mutes audio output on the codec.

Arguments:



Return Value:

    None.

--*/
{
    WaveResource->MoreData = FALSE;
}

⌨️ 快捷键说明

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