soc-utils.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /*
  2. * soc-util.c -- ALSA SoC Audio Layer utility functions
  3. *
  4. * Copyright 2009 Wolfson Microelectronics PLC.
  5. *
  6. * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
  7. * Liam Girdwood <lrg@slimlogic.co.uk>
  8. *
  9. *
  10. * This program is free software; you can redistribute it and/or modify it
  11. * under the terms of the GNU General Public License as published by the
  12. * Free Software Foundation; either version 2 of the License, or (at your
  13. * option) any later version.
  14. */
  15. #include <sound/core.h>
  16. #include <sound/pcm.h>
  17. #include <sound/pcm_params.h>
  18. #include <sound/soc.h>
  19. int snd_soc_calc_frame_size(int sample_size, int channels, int tdm_slots)
  20. {
  21. return sample_size * channels * tdm_slots;
  22. }
  23. EXPORT_SYMBOL_GPL(snd_soc_calc_frame_size);
  24. int snd_soc_params_to_frame_size(struct snd_pcm_hw_params *params)
  25. {
  26. int sample_size;
  27. switch (params_format(params)) {
  28. case SNDRV_PCM_FORMAT_S16_LE:
  29. case SNDRV_PCM_FORMAT_S16_BE:
  30. sample_size = 16;
  31. break;
  32. case SNDRV_PCM_FORMAT_S20_3LE:
  33. case SNDRV_PCM_FORMAT_S20_3BE:
  34. sample_size = 20;
  35. break;
  36. case SNDRV_PCM_FORMAT_S24_LE:
  37. case SNDRV_PCM_FORMAT_S24_BE:
  38. sample_size = 24;
  39. break;
  40. case SNDRV_PCM_FORMAT_S32_LE:
  41. case SNDRV_PCM_FORMAT_S32_BE:
  42. sample_size = 32;
  43. break;
  44. default:
  45. return -ENOTSUPP;
  46. }
  47. return snd_soc_calc_frame_size(sample_size, params_channels(params),
  48. 1);
  49. }
  50. EXPORT_SYMBOL_GPL(snd_soc_params_to_frame_size);
  51. int snd_soc_calc_bclk(int fs, int sample_size, int channels, int tdm_slots)
  52. {
  53. return fs * snd_soc_calc_frame_size(sample_size, channels, tdm_slots);
  54. }
  55. EXPORT_SYMBOL_GPL(snd_soc_calc_bclk);
  56. int snd_soc_params_to_bclk(struct snd_pcm_hw_params *params)
  57. {
  58. int ret;
  59. ret = snd_soc_params_to_frame_size(params);
  60. if (ret > 0)
  61. return ret * params_rate(params);
  62. else
  63. return ret;
  64. }
  65. EXPORT_SYMBOL_GPL(snd_soc_params_to_bclk);