Home | History | Annotate | Download | only in server
      1 /* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
      2  * Use of this source code is governed by a BSD-style license that can be
      3  * found in the LICENSE file.
      4  */
      5 
      6 #ifndef _CRAS_MIX_H
      7 #define _CRAS_MIX_H
      8 
      9 struct cras_audio_shm;
     10 
     11 /* SIMD optimisation flags */
     12 #define CPU_X86_SSE4_2		1
     13 #define CPU_X86_AVX			2
     14 #define CPU_X86_AVX2			4
     15 #define CPU_X86_FMA			8
     16 
     17 void cras_mix_init(unsigned int flags);
     18 
     19 /* Scale the given buffer with the provided scaler and increment.
     20  * Args:
     21  *    fmt - The format (SND_PCM_FORMAT_*)
     22  *    buff - Buffer of samples to scale.
     23  *    frame - The number of frames to render.
     24  *    scaler - Amount to scale samples (0.0 - 1.0).
     25  *    increment - The increment(+/-) of scaler at each frame. The scaler after
     26  *                increasing/descreasing will be clipped to (0.0 - 1.0).
     27  *    channel - Number of samples in a frame.
     28  */
     29 void cras_scale_buffer_increment(snd_pcm_format_t fmt, uint8_t *buff,
     30 				 unsigned int frame, float scaler,
     31 				 float increment, int channel);
     32 
     33 /* Scale the given buffer with the provided scaler.
     34  * Args:
     35  *    fmt - The format (SND_PCM_FORMAT_*)
     36  *    buff - Buffer of samples to scale.
     37  *    scaler - Amount to scale samples (0.0 - 1.0).
     38  *    count - The number of samples to render, on return holds the number
     39  *        actually mixed.
     40  */
     41 void cras_scale_buffer(snd_pcm_format_t fmt, uint8_t *buff, unsigned int count,
     42 		       float scaler);
     43 
     44 /* Add src buffer to dst, scaling and setting mute.
     45  * Args:
     46  *    fmt - The format (SND_PCM_FORMAT_*)
     47  *    dst - Buffer of samples to mix to.
     48  *    src - Buffer of samples to mix from.
     49  *    count - The number of samples to mix.
     50  *    index - If zero this is the first buffer written to dst.
     51  *    mute - Is the stream providing the buffer muted.
     52  *    mix_vol - Scaler for the buffer to be mixed.
     53  */
     54 void cras_mix_add(snd_pcm_format_t fmt, uint8_t *dst, uint8_t *src,
     55 		  unsigned int count, unsigned int index,
     56 		  int mute, float mix_vol);
     57 
     58 /* Add src buffer to dst with independent channel strides.
     59  * Args:
     60  *    fmt - The format (SND_PCM_FORMAT_*)
     61  *    dst - Buffer of samples to mix to.
     62  *    src - Buffer of samples to mix from.
     63  *    count - The number of samples to mix.
     64  *    dst_stride - Stride between channel samples in dst in bytes.
     65  *    src_stride - Stride between channel samples in src in bytes.
     66  *    scaler - Amount to scale samples.
     67  */
     68 void cras_mix_add_scale_stride(snd_pcm_format_t fmt, uint8_t *dst, uint8_t *src,
     69 			 unsigned int count, unsigned int dst_stride,
     70 			 unsigned int src_stride, float scaler);
     71 
     72 /* Mutes the given buffer.
     73  * Args:
     74  *    num_channel - Number of channels in data.
     75  *    frame_bytes - number of bytes in a frame.
     76  *    count - The number of frames to render.
     77  */
     78 size_t cras_mix_mute_buffer(uint8_t *dst,
     79 			    size_t frame_bytes,
     80 			    size_t count);
     81 
     82 #endif /* _CRAS_MIX_H */
     83