📄 auddspeakerdriver.c
字号:
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2008, Atmel Corporation
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the disclaimer below.
*
* Atmel's name may not be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* ----------------------------------------------------------------------------
*/
//------------------------------------------------------------------------------
// Headers
//------------------------------------------------------------------------------
#include "AUDDSpeakerDriver.h"
#include "AUDDSpeakerDriverDescriptors.h"
#include "AUDDSpeakerChannel.h"
#include <utility/trace.h>
#include <utility/led.h>
#include <usb/common/audio/AUDGenericRequest.h>
#include <usb/common/audio/AUDFeatureUnitRequest.h>
#include <usb/device/core/USBDDriver.h>
//------------------------------------------------------------------------------
// Internal types
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// Audio speaker driver internal state.
//------------------------------------------------------------------------------
typedef struct {
/// USB device driver instance.
USBDDriver usbdDriver;
/// List of AUDDSpeakerChannel instances for playback.
AUDDSpeakerChannel channels[AUDDSpeakerDriver_NUMCHANNELS+1];
} AUDDSpeakerDriver;
//------------------------------------------------------------------------------
// Internal variables
//------------------------------------------------------------------------------
/// Global USB audio speaker driver instance.
static AUDDSpeakerDriver auddSpeakerDriver;
/// Array for storing the current setting of each interface.
static unsigned char auddSpeakerDriverInterfaces[2];
/// Intermediate storage variable for the mute status of a channel.
static unsigned char muted;
//------------------------------------------------------------------------------
// Internal functions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// Callback triggered after the new mute status of a channel has been read
/// by AUDDSpeakerDriver_SetFeatureCurrentValue. Changes the mute status
/// of the given channel accordingly.
/// \param channel Number of the channel whose mute status has changed.
//------------------------------------------------------------------------------
static void AUDDSpeakerDriver_MuteReceived(unsigned int channel)
{
if (muted) {
AUDDSpeakerChannel_Mute(&(auddSpeakerDriver.channels[channel]));
}
else {
AUDDSpeakerChannel_Unmute(&(auddSpeakerDriver.channels[channel]));
}
USBD_Write(0, 0, 0, 0, 0);
}
//------------------------------------------------------------------------------
/// Sets the current value of a particular Feature control of a channel.
/// \param entity Entity number.
/// \param channel Channel number.
/// \param control Control selector value (see TODO).
/// \param length Length of the data containing the new value.
//------------------------------------------------------------------------------
static void AUDDSpeakerDriver_SetFeatureCurrentValue(unsigned char entity,
unsigned char channel,
unsigned char control,
unsigned short length)
{
TRACE_INFO_WP("sFeature ");
TRACE_DEBUG("\b(E%d, CS%d, CN%d, L%d) ",
entity, control, channel, length);
// Check the the requested control is supported
// Control/channel combination not supported
if ((control == AUDFeatureUnitRequest_MUTE)
&& (channel < (AUDDSpeakerDriver_NUMCHANNELS+1))
&& (length == 1)) {
unsigned int argument = channel; // Avoids compiler warning
USBD_Read(0, // Endpoint #0
&muted,
sizeof(muted),
(TransferCallback) AUDDSpeakerDriver_MuteReceived,
(void *) argument);
}
// Control/channel combination not supported
else {
USBD_Stall(0);
}
}
//------------------------------------------------------------------------------
/// Sends the current value of a particular channel Feature to the USB host.
/// \param entity Entity number.
/// \param channel Channel number.
/// \param control Control selector value (see TODO).
/// \param length Length of the data to return.
//------------------------------------------------------------------------------
static void AUDDSpeakerDriver_GetFeatureCurrentValue(unsigned char entity,
unsigned char channel,
unsigned char control,
unsigned char length)
{
TRACE_INFO_WP("gFeature ");
TRACE_DEBUG("\b(CS%d, CN%d, L%d) ", control, channel, length);
// Check that the requested control is supported
// Master channel mute control
if ((control == AUDFeatureUnitRequest_MUTE)
&& (channel < (AUDDSpeakerDriver_NUMCHANNELS+1))
&& (length == 1)) {
muted = AUDDSpeakerChannel_IsMuted(&(auddSpeakerDriver.channels[channel]));
USBD_Write(0, &muted, sizeof(muted), 0, 0);
}
else {
USBD_Stall(0);
}
}
///*
// Function: AUDDSpeakerDriver_SetInterface
// Changes the current active alternate setting of the given interface.
//
// Parameters:
//
//*/
//TRACE_DEBUG_M("SetInterface(%d,%d) ", setup->wIndex, setup->wValue);
//
// /* Check that interface is AudioStreaming OUT */
// if (setup->wIndex == INTERFACE_ID_AUDIOSTREAMING_OUT) {
//
// /* Check desired alternate setting */
// switch (setup->wValue) {
// case 0:
// case 1:
// if (speakerDriver->isOutStreamEnabled != setup->wValue) {
//
// speakerDriver->isOutStreamEnabled = setup->wValue;
// SPK_OutStreamStatusChanged(speakerDriver);
// LED_SetGlowing(LED_OTHER, setup->wValue);
// }
// USB_SendZLP0(usbDriver, 0, 0);
// break;
//
// default:
// USB_Stall(usbDriver, 0);
// }
// }
// else {
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -