Statistics
| Branch: | Tag: | Revision:

root / LUFA / Drivers / USB / Class / Device / Audio.c @ 978b99e5

History | View | Annotate | Download (6.12 KB)

1
/*
2
             LUFA Library
3
     Copyright (C) Dean Camera, 2011.
4

5
  dean [at] fourwalledcubicle [dot] com
6
           www.lufa-lib.org
7
*/
8

    
9
/*
10
  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
11

12
  Permission to use, copy, modify, distribute, and sell this
13
  software and its documentation for any purpose is hereby granted
14
  without fee, provided that the above copyright notice appear in
15
  all copies and that both that the copyright notice and this
16
  permission notice and warranty disclaimer appear in supporting
17
  documentation, and that the name of the author not be used in
18
  advertising or publicity pertaining to distribution of the
19
  software without specific, written prior permission.
20

21
  The author disclaim all warranties with regard to this
22
  software, including all implied warranties of merchantability
23
  and fitness.  In no event shall the author be liable for any
24
  special, indirect or consequential damages or any damages
25
  whatsoever resulting from loss of use, data or profits, whether
26
  in an action of contract, negligence or other tortious action,
27
  arising out of or in connection with the use or performance of
28
  this software.
29
*/
30

    
31
#define  __INCLUDE_FROM_USB_DRIVER
32
#include "../../Core/USBMode.h"
33

    
34
#if defined(USB_CAN_BE_DEVICE)
35

    
36
#define  __INCLUDE_FROM_AUDIO_DRIVER
37
#define  __INCLUDE_FROM_AUDIO_DEVICE_C
38
#include "Audio.h"
39

    
40
void Audio_Device_ProcessControlRequest(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
41
{
42
        if (!(Endpoint_IsSETUPReceived()))
43
          return;
44

    
45
        if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) == REQREC_INTERFACE)
46
        {
47
                if (USB_ControlRequest.wIndex != AudioInterfaceInfo->Config.StreamingInterfaceNumber)
48
                  return;
49
        }
50
        else if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) == REQREC_ENDPOINT)
51
        {
52
                bool EndpointFilterMatch = false;
53
        
54
                EndpointFilterMatch |= (AudioInterfaceInfo->Config.DataINEndpointNumber &&
55
                                        ((uint8_t)USB_ControlRequest.wIndex == (ENDPOINT_DIR_IN  | AudioInterfaceInfo->Config.DataINEndpointNumber)));
56
        
57
                EndpointFilterMatch |= (AudioInterfaceInfo->Config.DataOUTEndpointNumber &&
58
                                        ((uint8_t)USB_ControlRequest.wIndex == (ENDPOINT_DIR_OUT | AudioInterfaceInfo->Config.DataOUTEndpointNumber)));
59

    
60
                if (!(EndpointFilterMatch))
61
                  return;
62
        }        
63

    
64
        switch (USB_ControlRequest.bRequest)
65
        {
66
                case REQ_SetInterface:
67
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_INTERFACE))
68
                        {
69
                                Endpoint_ClearSETUP();
70
                                Endpoint_ClearStatusStage();
71

    
72
                                AudioInterfaceInfo->State.InterfaceEnabled = ((USB_ControlRequest.wValue & 0xFF) != 0);
73
                                EVENT_Audio_Device_StreamStartStop(AudioInterfaceInfo);
74
                        }
75

    
76
                        break;
77
                case AUDIO_REQ_GetStatus:
78
                        if ((USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) ||
79
                            (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT)))
80
                        {
81
                                Endpoint_ClearSETUP();
82
                                Endpoint_ClearStatusStage();
83
                        }
84

    
85
                        break;
86
                case AUDIO_REQ_SetCurrent:
87
                case AUDIO_REQ_SetMinimum:
88
                case AUDIO_REQ_SetMaximum:
89
                case AUDIO_REQ_SetResolution:
90
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT))
91
                        {
92
                                uint8_t EndpointProperty = USB_ControlRequest.bRequest;
93
                                uint8_t EndpointAddress  = (uint8_t)USB_ControlRequest.wIndex;
94
                                uint8_t EndpointControl  = (USB_ControlRequest.wValue >> 8);
95
                        
96
                                if (CALLBACK_Audio_Device_GetSetEndpointProperty(AudioInterfaceInfo, EndpointProperty, EndpointAddress,
97
                                                                                 EndpointControl, NULL, NULL))
98
                                {
99
                                        uint16_t ValueLength = USB_ControlRequest.wLength;
100
                                        uint8_t  Value[ValueLength];
101
                                        
102
                                        Endpoint_ClearSETUP();
103
                                        Endpoint_Read_Control_Stream_LE(Value, ValueLength);
104
                                        Endpoint_ClearIN();                                        
105

    
106
                                        CALLBACK_Audio_Device_GetSetEndpointProperty(AudioInterfaceInfo, EndpointProperty, EndpointAddress,
107
                                                                                     EndpointControl, &ValueLength, Value);
108
                                }                                
109
                        }
110

    
111
                        break;
112
                case AUDIO_REQ_GetCurrent:
113
                case AUDIO_REQ_GetMinimum:
114
                case AUDIO_REQ_GetMaximum:
115
                case AUDIO_REQ_GetResolution:
116
                        if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_ENDPOINT))
117
                        {
118
                                uint8_t  EndpointProperty = USB_ControlRequest.bRequest;
119
                                uint8_t  EndpointAddress  = (uint8_t)USB_ControlRequest.wIndex;
120
                                uint8_t  EndpointControl  = (USB_ControlRequest.wValue >> 8);
121
                                uint16_t ValueLength      = USB_ControlRequest.wLength;
122
                                uint8_t  Value[ValueLength];
123

    
124
                                if (CALLBACK_Audio_Device_GetSetEndpointProperty(AudioInterfaceInfo, EndpointProperty, EndpointAddress,
125
                                                                                 EndpointControl, &ValueLength, Value))
126
                                {
127
                                        Endpoint_ClearSETUP();
128
                                        Endpoint_Write_Control_Stream_LE(Value, ValueLength);
129
                                        Endpoint_ClearOUT();                                        
130
                                }
131
                        }
132

    
133
                        break;
134
        }
135
}
136

    
137
bool Audio_Device_ConfigureEndpoints(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
138
{
139
        memset(&AudioInterfaceInfo->State, 0x00, sizeof(AudioInterfaceInfo->State));
140

    
141
        for (uint8_t EndpointNum = 1; EndpointNum < ENDPOINT_TOTAL_ENDPOINTS; EndpointNum++)
142
        {
143
                uint16_t Size;
144
                uint8_t  Type;
145
                uint8_t  Direction;
146
                bool     DoubleBanked;
147

    
148
                if (EndpointNum == AudioInterfaceInfo->Config.DataINEndpointNumber)
149
                {
150
                        Size         = AudioInterfaceInfo->Config.DataINEndpointSize;
151
                        Direction    = ENDPOINT_DIR_IN;
152
                        Type         = EP_TYPE_ISOCHRONOUS;
153
                        DoubleBanked = true;
154
                }
155
                else if (EndpointNum == AudioInterfaceInfo->Config.DataOUTEndpointNumber)
156
                {
157
                        Size         = AudioInterfaceInfo->Config.DataOUTEndpointSize;
158
                        Direction    = ENDPOINT_DIR_OUT;
159
                        Type         = EP_TYPE_ISOCHRONOUS;
160
                        DoubleBanked = true;
161
                }
162
                else
163
                {
164
                        continue;
165
                }
166

    
167
                if (!(Endpoint_ConfigureEndpoint(EndpointNum, Type, Direction, Size,
168
                                                 DoubleBanked ? ENDPOINT_BANK_DOUBLE : ENDPOINT_BANK_SINGLE)))
169
                {
170
                        return false;
171
                }
172
        }
173

    
174
        return true;
175
}
176

    
177
void Audio_Device_Event_Stub(void)
178
{
179

    
180
}
181

    
182
#endif