Merge pull request #93 from zyp/master
[fw/stlink] / example / stm32f4 / STM32_USB_Device_Library / Class / audio / src / usbd_audio_out_if.c
1 /**
2   ******************************************************************************
3   * @file    usbd_audio_out_if.c
4   * @author  MCD Application Team
5   * @version V1.0.0
6   * @date    22-July-2011
7   * @brief   This file provides the Audio Out (palyback) interface API.
8   ******************************************************************************
9   * @attention
10   *
11   * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
12   * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
13   * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
14   * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
15   * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
16   * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
17   *
18   * <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>
19   ******************************************************************************
20   */ 
21
22 /* Includes ------------------------------------------------------------------*/
23 #include "usbd_audio_core.h"
24 #include "usbd_audio_out_if.h"
25
26
27
28
29 /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
30   * @{
31   */
32
33
34 /** @defgroup usbd_audio_out_if 
35   * @brief usbd out interface module
36   * @{
37   */ 
38
39 /** @defgroup usbd_audio_out_if_Private_TypesDefinitions
40   * @{
41   */ 
42 /**
43   * @}
44   */ 
45
46
47 /** @defgroup usbd_audio_out_if_Private_Defines
48   * @{
49   */ 
50 /**
51   * @}
52   */ 
53
54
55 /** @defgroup usbd_audio_out_if_Private_Macros
56   * @{
57   */ 
58 /**
59   * @}
60   */ 
61
62
63 /** @defgroup usbd_audio_out_if_Private_FunctionPrototypes
64   * @{
65   */
66 static uint8_t  Init         (uint32_t  AudioFreq, uint32_t Volume, uint32_t options);
67 static uint8_t  DeInit       (uint32_t options);
68 static uint8_t  AudioCmd     (uint8_t* pbuf, uint32_t size, uint8_t cmd);
69 static uint8_t  VolumeCtl    (uint8_t vol);
70 static uint8_t  MuteCtl      (uint8_t cmd);
71 static uint8_t  PeriodicTC   (uint8_t cmd);
72 static uint8_t  GetState     (void);
73
74 /**
75   * @}
76   */ 
77
78 /** @defgroup usbd_audio_out_if_Private_Variables
79   * @{
80   */ 
81 AUDIO_FOPS_TypeDef  AUDIO_OUT_fops = 
82 {
83   Init,
84   DeInit,
85   AudioCmd,
86   VolumeCtl,
87   MuteCtl,
88   PeriodicTC,
89   GetState
90 };
91
92 static uint8_t AudioState = AUDIO_STATE_INACTIVE;
93
94 /**
95   * @}
96   */ 
97
98 /** @defgroup usbd_audio_out_if_Private_Functions
99   * @{
100   */ 
101
102 /**
103   * @brief  Init
104   *         Initialize and configures all required resources for audio play function.
105   * @param  AudioFreq: Statrtup audio frequency. 
106   * @param  Volume: Startup volume to be set.
107   * @param  options: specific options passed to low layer function.
108   * @retval AUDIO_OK if all operations succeed, AUDIO_FAIL else.
109   */
110 static uint8_t  Init         (uint32_t AudioFreq, 
111                               uint32_t Volume, 
112                               uint32_t options)
113 {
114   static uint32_t Initialized = 0;
115   
116   /* Check if the low layer has already been initialized */
117   if (Initialized == 0)
118   {
119     /* Call low layer function */
120     if (EVAL_AUDIO_Init(OUTPUT_DEVICE_AUTO, Volume, AudioFreq) != 0)
121     {
122       AudioState = AUDIO_STATE_ERROR;
123       return AUDIO_FAIL;
124     }
125     
126     /* Set the Initialization flag to prevent reinitializing the interface again */
127     Initialized = 1;
128   }
129   
130   /* Update the Audio state machine */
131   AudioState = AUDIO_STATE_ACTIVE;
132     
133   return AUDIO_OK;
134 }
135
136 /**
137   * @brief  DeInit
138   *         Free all resources used by low layer and stops audio-play function.
139   * @param  options: options passed to low layer function.
140   * @retval AUDIO_OK if all operations succeed, AUDIO_FAIL else.
141   */
142 static uint8_t  DeInit       (uint32_t options)
143 {
144   /* Update the Audio state machine */
145   AudioState = AUDIO_STATE_INACTIVE;
146   
147   return AUDIO_OK;
148 }
149
150 /**
151   * @brief  AudioCmd 
152   *         Play, Stop, Pause or Resume current file.
153   * @param  pbuf: address from which file shoud be played.
154   * @param  size: size of the current buffer/file.
155   * @param  cmd: command to be executed, can be AUDIO_CMD_PLAY , AUDIO_CMD_PAUSE, 
156   *              AUDIO_CMD_RESUME or AUDIO_CMD_STOP.
157   * @retval AUDIO_OK if all operations succeed, AUDIO_FAIL else.
158   */
159 static uint8_t  AudioCmd(uint8_t* pbuf, 
160                          uint32_t size,
161                          uint8_t cmd)
162 {
163   /* Check the current state */
164   if ((AudioState == AUDIO_STATE_INACTIVE) || (AudioState == AUDIO_STATE_ERROR))
165   {
166     AudioState = AUDIO_STATE_ERROR;
167     return AUDIO_FAIL;
168   }
169   
170   switch (cmd)
171   {
172     /* Process the PLAY command ----------------------------*/
173   case AUDIO_CMD_PLAY:
174     /* If current state is Active or Stopped */
175     if ((AudioState == AUDIO_STATE_ACTIVE) || \
176        (AudioState == AUDIO_STATE_STOPPED) || \
177        (AudioState == AUDIO_STATE_PLAYING))
178     {
179       Audio_MAL_Play((uint32_t)pbuf, (size/2));
180       AudioState = AUDIO_STATE_PLAYING;
181       return AUDIO_OK;
182     }
183     /* If current state is Paused */
184     else if (AudioState == AUDIO_STATE_PAUSED)
185     {
186       if (EVAL_AUDIO_PauseResume(AUDIO_RESUME, (uint32_t)pbuf, (size/2)) != 0)
187       {
188         AudioState = AUDIO_STATE_ERROR;
189         return AUDIO_FAIL;
190       }
191       else
192       {
193         AudioState = AUDIO_STATE_PLAYING;
194         return AUDIO_OK;
195       } 
196     } 
197     else /* Not allowed command */
198     {
199       return AUDIO_FAIL;
200     }
201     
202     /* Process the STOP command ----------------------------*/
203   case AUDIO_CMD_STOP:
204     if (AudioState != AUDIO_STATE_PLAYING)
205     {
206       /* Unsupported command */
207       return AUDIO_FAIL;
208     }
209     else if (EVAL_AUDIO_Stop(CODEC_PDWN_SW) != 0)
210     {
211       AudioState = AUDIO_STATE_ERROR;
212       return AUDIO_FAIL;
213     }
214     else
215     {
216       AudioState = AUDIO_STATE_STOPPED;
217       return AUDIO_OK;
218     }
219   
220     /* Process the PAUSE command ---------------------------*/
221   case AUDIO_CMD_PAUSE:
222     if (AudioState != AUDIO_STATE_PLAYING)
223     {
224       /* Unsupported command */
225       return AUDIO_FAIL;
226     }
227     else if (EVAL_AUDIO_PauseResume(AUDIO_PAUSE, (uint32_t)pbuf, (size/2)) != 0)
228     {
229       AudioState = AUDIO_STATE_ERROR;
230       return AUDIO_FAIL;
231     }
232     else
233     {
234       AudioState = AUDIO_STATE_PAUSED;
235       return AUDIO_OK;
236     } 
237     
238     /* Unsupported command ---------------------------------*/
239   default:
240     return AUDIO_FAIL;
241   }  
242 }
243
244 /**
245   * @brief  VolumeCtl
246   *         Set the volume level in %
247   * @param  vol: volume level to be set in % (from 0% to 100%)
248   * @retval AUDIO_OK if all operations succeed, AUDIO_FAIL else.
249   */
250 static uint8_t  VolumeCtl    (uint8_t vol)
251 {
252   /* Call low layer volume setting function */  
253   if (EVAL_AUDIO_VolumeCtl(vol) != 0)
254   {
255     AudioState = AUDIO_STATE_ERROR;
256     return AUDIO_FAIL;
257   }
258   
259   return AUDIO_OK;
260 }
261
262 /**
263   * @brief  MuteCtl
264   *         Mute or Unmute the audio current output
265   * @param  cmd: can be 0 to unmute, or 1 to mute.
266   * @retval AUDIO_OK if all operations succeed, AUDIO_FAIL else.
267   */
268 static uint8_t  MuteCtl      (uint8_t cmd)
269 {
270   /* Call low layer mute setting function */  
271   if (EVAL_AUDIO_Mute(cmd) != 0)
272   {
273     AudioState = AUDIO_STATE_ERROR;
274     return AUDIO_FAIL;
275   }
276   
277   return AUDIO_OK;
278 }
279
280 /**
281   * @brief  
282   *         
283   * @param  
284   * @param  
285   * @retval AUDIO_OK if all operations succeed, AUDIO_FAIL else.
286   */
287 static uint8_t  PeriodicTC   (uint8_t cmd)
288 {
289
290   
291   return AUDIO_OK;
292 }
293
294
295 /**
296   * @brief  GetState
297   *         Return the current state of the audio machine
298   * @param  None
299   * @retval Current State.
300   */
301 static uint8_t  GetState   (void)
302 {
303   return AudioState;
304 }
305
306 /**
307   * @}
308   */ 
309
310 /**
311   * @}
312   */ 
313
314 /**
315   * @}
316   */ 
317
318 /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/