summaryrefslogtreecommitdiff
path: root/hifi/xaf/host-apf/playback/xa_playback.c
diff options
context:
space:
mode:
Diffstat (limited to 'hifi/xaf/host-apf/playback/xa_playback.c')
-rw-r--r--hifi/xaf/host-apf/playback/xa_playback.c366
1 files changed, 0 insertions, 366 deletions
diff --git a/hifi/xaf/host-apf/playback/xa_playback.c b/hifi/xaf/host-apf/playback/xa_playback.c
deleted file mode 100644
index 2a8eefdf..00000000
--- a/hifi/xaf/host-apf/playback/xa_playback.c
+++ /dev/null
@@ -1,366 +0,0 @@
-/*******************************************************************************
-* Copyright (C) 2018 Cadence Design Systems, Inc.
-*
-* Permission is hereby granted, free of charge, to any person obtaining
-* a copy of this software and associated documentation files (the
-* "Software"), to use this Software with Cadence processor cores only and
-* not with any other processors and platforms, subject to
-* the following conditions:
-*
-* The above copyright notice and this permission notice shall be included
-* in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-******************************************************************************/
-
-#define MODULE_TAG PLYBK
-
-#include <tinyalsa/asoundlib.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-#include <signal.h>
-#include <sys/ioctl.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-
-#include "xf.h"
-#include "xa_playback.h"
-
-#if 0
-#define ID_RIFF 0x46464952
-#define ID_WAVE 0x45564157
-#define ID_FMT 0x20746d66
-#define ID_DATA 0x61746164
-
-#define HIFI_MISC_IOCTL_PCM_GAIN _IOW('A', 0x7b, struct misc_io_pcm_buf_param)
-#define HIFI_DSP_MISC_DRIVER "/dev/hifi_misc"
-struct misc_io_pcm_buf_param {
- uint64_t buf;
- uint32_t buf_size;
-};
-
-struct riff_wave_header {
- uint32_t riff_id;
- uint32_t riff_sz;
- uint32_t wave_id;
-};
-
-struct chunk_header {
- uint32_t id;
- uint32_t sz;
-};
-
-struct chunk_fmt {
- uint16_t audio_format;
- uint16_t num_channels;
- uint32_t sample_rate;
- uint32_t byte_rate;
- uint16_t block_align;
- uint16_t bits_per_sample;
-};
-
-static int s_close = 0;
-
-void play_sample(FILE *file, unsigned int card, unsigned int device, unsigned int channels,
- unsigned int rate, unsigned int bits, unsigned int period_size,
- unsigned int period_count);
-
-void stream_close(int sig)
-{
- /* allow the stream to be closed gracefully */
- signal(sig, SIG_IGN);
- s_close = 1;
-}
-#endif
-
-#if 0
-int main(int argc, char **argv)
-{
- FILE *file;
- struct riff_wave_header riff_wave_header;
- struct chunk_header chunk_header;
- struct chunk_fmt chunk_fmt;
- unsigned int device = 0;
- unsigned int card = 0;
- unsigned int period_size = 1024;
- unsigned int period_count = 4;
- char *filename;
- int more_chunks = 1;
-
- if (argc < 2) {
- fprintf(stderr, "Usage: %s file.wav [-D card] [-d device] [-p period_size]"
- " [-n n_periods] \n", argv[0]);
- return 1;
- }
-
- filename = argv[1];
- file = fopen(filename, "rb");
- if (!file) {
- fprintf(stderr, "Unable to open file '%s'\n", filename);
- return 1;
- }
-
- fread(&riff_wave_header, sizeof(riff_wave_header), 1, file);
- if ((riff_wave_header.riff_id != ID_RIFF) ||
- (riff_wave_header.wave_id != ID_WAVE)) {
- fprintf(stderr, "Error: '%s' is not a riff/wave file\n", filename);
- fclose(file);
- return 1;
- }
-
- do {
- fread(&chunk_header, sizeof(chunk_header), 1, file);
-
- switch (chunk_header.id) {
- case ID_FMT:
- fread(&chunk_fmt, sizeof(chunk_fmt), 1, file);
- /* If the format header is larger, skip the rest */
- if (chunk_header.sz > sizeof(chunk_fmt))
- fseek(file, chunk_header.sz - sizeof(chunk_fmt), SEEK_CUR);
- break;
- case ID_DATA:
- /* Stop looking for chunks */
- more_chunks = 0;
- break;
- default:
- /* Unknown chunk, skip bytes */
- fseek(file, chunk_header.sz, SEEK_CUR);
- }
- } while (more_chunks);
-
- /* parse command line arguments */
- argv += 2;
- while (*argv) {
- if (strcmp(*argv, "-d") == 0) {
- argv++;
- if (*argv)
- device = atoi(*argv);
- }
- if (strcmp(*argv, "-p") == 0) {
- argv++;
- if (*argv)
- period_size = atoi(*argv);
- }
- if (strcmp(*argv, "-n") == 0) {
- argv++;
- if (*argv)
- period_count = atoi(*argv);
- }
- if (strcmp(*argv, "-D") == 0) {
- argv++;
- if (*argv)
- card = atoi(*argv);
- }
- if (*argv)
- argv++;
- }
-
- play_sample(file, card, device, chunk_fmt.num_channels, chunk_fmt.sample_rate,
- chunk_fmt.bits_per_sample, period_size, period_count);
-
- fclose(file);
-
- return 0;
-}
-#endif
-
-static int check_param(struct pcm_params *params, unsigned int param, unsigned int value,
- char *param_name, char *param_unit)
-{
- unsigned int min;
- unsigned int max;
- int is_within_bounds = 1;
-
- min = pcm_params_get_min(params, param);
- if (value < min) {
- TRACE(ERROR, _x("%s is %u%s, device only supports >= %u%s\n"), param_name, value,
- param_unit, min, param_unit);
- is_within_bounds = 0;
- }
-
- max = pcm_params_get_max(params, param);
- if (value > max) {
- TRACE(ERROR, _x("%s is %u%s, device only supports <= %u%s\n"), param_name, value,
- param_unit, max, param_unit);
- is_within_bounds = 0;
- }
-
- return is_within_bounds;
-}
-
-static int sample_is_playable(unsigned int card, unsigned int device, unsigned int channels,
- unsigned int rate, unsigned int bits, unsigned int period_size,
- unsigned int period_count)
-{
- struct pcm_params *params;
- int can_play;
-
- params = pcm_params_get(card, device, PCM_OUT);
- if (params == NULL) {
- TRACE(ERROR, _x("Unable to open PCM device %u.\n"), device);
- return 0;
- }
-
- can_play = check_param(params, PCM_PARAM_RATE, rate, "Sample rate", "Hz");
- can_play &= check_param(params, PCM_PARAM_CHANNELS, channels, "Sample", " channels");
- can_play &= check_param(params, PCM_PARAM_SAMPLE_BITS, bits, "Bitrate", " bits");
- can_play &= check_param(params, PCM_PARAM_PERIOD_SIZE, period_size, "Period size", "Hz");
- can_play &= check_param(params, PCM_PARAM_PERIODS, period_count, "Period count", "Hz");
-
- pcm_params_free(params);
-
- return can_play;
-}
-
-void *xa_playback_open(unsigned int card,
- unsigned int device,
- unsigned int channels,
- unsigned int rate,
- unsigned int bits,
- unsigned int period_size,
- unsigned int period_count)
-{
- struct pcm_config config;
- struct pcm *pcm;
-
- memset(&config, 0, sizeof(config));
- config.channels = channels;
- config.rate = rate;
- config.period_size = period_size;
- config.period_count = period_count;
- if (bits == 32)
- config.format = PCM_FORMAT_S32_LE;
- else if (bits == 16)
- config.format = PCM_FORMAT_S16_LE;
- config.start_threshold = 0;
- config.stop_threshold = 0;
- config.silence_threshold = 0;
-
- if (!sample_is_playable(card, device, channels, rate, bits, period_size, period_count)) {
- return NULL;
- }
-
- pcm = pcm_open(card, device, PCM_OUT, &config);
- if (!pcm || !pcm_is_ready(pcm)) {
- TRACE(ERROR, _x("Unable to open PCM device %u (%s)\n"),
- device, pcm_get_error(pcm));
- return NULL;
- }
-
- return pcm;
-}
-
-int xa_playback_buf(void *handle,
- const void *data,
- unsigned int nbytes)
-{
- int err;
-
- if (!handle || !data)
- return XA_PLAYBACK_INVALID_PARAM;
-
- if (nbytes > 0) {
- err = pcm_write(handle, data, nbytes);
-
- if (err == -EINVAL) return XA_PLAYBACK_INVALID_PARAM;
- if (err == -EPIPE ) return XA_PLAYBACK_UNDERRUN;
- }
-
- return XA_PLAYBACK_OK;
-}
-
-int xa_playback_close(void *handle)
-{
- return pcm_close(handle);
-}
-
-#if 0
-void play_sample(FILE *file, unsigned int card, unsigned int device, unsigned int channels,
- unsigned int rate, unsigned int bits, unsigned int period_size,
- unsigned int period_count)
-{
- struct pcm_config config;
- struct pcm *pcm;
- char *buffer;
- int size;
- int num_read;
- int hifi_dsp_fd;
- struct misc_io_pcm_buf_param pcmbuf;
-
- hifi_dsp_fd = open(HIFI_DSP_MISC_DRIVER, O_RDWR, 0);
- if(hifi_dsp_fd < 0){
- printf("Error opening hifi dsp device %d", errno);
- }
-
- memset(&config, 0, sizeof(config));
- config.channels = channels;
- config.rate = rate;
- config.period_size = period_size;
- config.period_count = period_count;
- if (bits == 32)
- config.format = PCM_FORMAT_S32_LE;
- else if (bits == 16)
- config.format = PCM_FORMAT_S16_LE;
- config.start_threshold = 0;
- config.stop_threshold = 0;
- config.silence_threshold = 0;
-
- if (!sample_is_playable(card, device, channels, rate, bits, period_size, period_count)) {
- return;
- }
-
- pcm = pcm_open(card, device, PCM_OUT, &config);
- if (!pcm || !pcm_is_ready(pcm)) {
- fprintf(stderr, "Unable to open PCM device %u (%s)\n",
- device, pcm_get_error(pcm));
- return;
- }
-
- size = pcm_frames_to_bytes(pcm, pcm_get_buffer_size(pcm));
- buffer = malloc(size);
- if (!buffer) {
- fprintf(stderr, "Unable to allocate %d bytes\n", size);
- free(buffer);
- pcm_close(pcm);
- return;
- }
-
- printf("Playing sample: %u ch, %u hz, %u bit\n", channels, rate, bits);
-
- /* catch ctrl-c to shutdown cleanly */
- signal(SIGINT, stream_close);
-
- do {
- num_read = fread(buffer, 1, size, file);
-
- pcmbuf.buf =(uint64_t) buffer;
- pcmbuf.buf_size = num_read;
- if(hifi_dsp_fd) {
- // printf("ioctl send \n");
- ioctl(hifi_dsp_fd,HIFI_MISC_IOCTL_PCM_GAIN, &pcmbuf);
- // printf("ioctl complete \n");
- }
-
- if (num_read > 0) {
- if (pcm_write(pcm, buffer, num_read)) {
- fprintf(stderr, "Error playing sample\n");
- break;
- }
- }
- } while (!s_close && num_read > 0);
-
- free(buffer);
- pcm_close(pcm);
- close(hifi_dsp_fd);
-}
-#endif