1c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent/* 2c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * BSD LICENSE 3c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * 4c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * tinyplay command line player for compress audio offload in alsa 5c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * Copyright (c) 2011-2012, Intel Corporation 6c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * All rights reserved. 7c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * 8c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * Author: Vinod Koul <vinod.koul@linux.intel.com> 9c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * 10c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * Redistribution and use in source and binary forms, with or without 11c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * modification, are permitted provided that the following conditions are met: 12c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * 13c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * Redistributions of source code must retain the above copyright notice, 14c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * this list of conditions and the following disclaimer. 15c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * Redistributions in binary form must reproduce the above copyright notice, 16c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * this list of conditions and the following disclaimer in the documentation 17c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * and/or other materials provided with the distribution. 18c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * Neither the name of Intel Corporation nor the names of its contributors 19c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * may be used to endorse or promote products derived from this software 20c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * without specific prior written permission. 21c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * 22c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 23c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 26c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 27c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 28c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 29c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 30c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 31c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 32c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * THE POSSIBILITY OF SUCH DAMAGE. 33c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * 34c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * LGPL LICENSE 35c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * 36c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * tinyplay command line player for compress audio offload in alsa 37c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * Copyright (c) 2011-2012, Intel Corporation. 38c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * 39c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * This program is free software; you can redistribute it and/or modify it 40c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * under the terms and conditions of the GNU Lesser General Public License, 41c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * version 2.1, as published by the Free Software Foundation. 42c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * 43c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * This program is distributed in the hope it will be useful, but WITHOUT 44c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 45c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 46c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * License for more details. 47c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * 48c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * You should have received a copy of the GNU Lesser General Public License 49c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * along with this program; if not, write to 50c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * the Free Software Foundation, Inc., 51c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 52c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent */ 53c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 54c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent#include <stdint.h> 55c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent#include <linux/types.h> 56c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent#include <fcntl.h> 57c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent#include <errno.h> 58c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent#include <unistd.h> 59c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent#include <stdio.h> 60c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent#include <stdlib.h> 61c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent#include <string.h> 62c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent#include <signal.h> 63c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent#include <stdbool.h> 64c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent#include <getopt.h> 65c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent#include <sys/time.h> 66c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent#define __force 67c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent#define __bitwise 68c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent#define __user 6979c370788bfeac8e2951cc35844fb96f15f28159Eric Laurent#include "sound/compress_params.h" 7079c370788bfeac8e2951cc35844fb96f15f28159Eric Laurent#include "tinycompress/tinycompress.h" 7179c370788bfeac8e2951cc35844fb96f15f28159Eric Laurent#include "tinycompress/tinymp3.h" 72c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 73c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurentstatic int verbose; 74c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 75c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurentstatic void usage(void) 76c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent{ 77c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent fprintf(stderr, "usage: cplay [OPTIONS] filename\n" 78c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent "-c\tcard number\n" 79c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent "-d\tdevice node\n" 80c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent "-b\tbuffer size\n" 81c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent "-f\tfragments\n\n" 82c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent "-v\tverbose mode\n" 83c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent "-h\tPrints this help list\n\n" 84c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent "Example:\n" 85c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent "\tcplay -c 1 -d 2 test.mp3\n" 86c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent "\tcplay -f 5 test.mp3\n"); 87c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 88c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent exit(EXIT_FAILURE); 89c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent} 90c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 91c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurentvoid play_samples(char *name, unsigned int card, unsigned int device, 92c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent unsigned long buffer_size, unsigned int frag); 93c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 94c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurentstruct mp3_header { 95c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent uint16_t sync; 96c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent uint8_t format1; 97c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent uint8_t format2; 98c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent}; 99c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 100c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurentint parse_mp3_header(struct mp3_header *header, unsigned int *num_channels, 101c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent unsigned int *sample_rate, unsigned int *bit_rate) 102c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent{ 103c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent int ver_idx, mp3_version, layer, bit_rate_idx, sample_rate_idx, channel_idx; 104c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 105c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent /* check sync bits */ 106c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent if ((header->sync & MP3_SYNC) != MP3_SYNC) { 107c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent fprintf(stderr, "Error: Can't find sync word\n"); 108c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent return -1; 109c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent } 110c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent ver_idx = (header->sync >> 11) & 0x03; 111c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent mp3_version = ver_idx == 0 ? MPEG25 : ((ver_idx & 0x1) ? MPEG1 : MPEG2); 112c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent layer = 4 - ((header->sync >> 9) & 0x03); 113c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent bit_rate_idx = ((header->format1 >> 4) & 0x0f); 114c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent sample_rate_idx = ((header->format1 >> 2) & 0x03); 115c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent channel_idx = ((header->format2 >> 6) & 0x03); 116c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 117c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent if (sample_rate_idx == 3 || layer == 4 || bit_rate_idx == 15) { 118c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent fprintf(stderr, "Error: Can't find valid header\n"); 119c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent return -1; 120c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent } 121c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent *num_channels = (channel_idx == MONO ? 1 : 2); 122c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent *sample_rate = mp3_sample_rates[mp3_version][sample_rate_idx]; 123c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent *bit_rate = (mp3_bit_rates[mp3_version][layer - 1][bit_rate_idx]) * 1000; 124c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent if (verbose) 125c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent printf("%s: exit\n", __func__); 126c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent return 0; 127c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent} 128c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 129c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurentint check_codec_format_supported(unsigned int card, unsigned int device, struct snd_codec *codec) 130c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent{ 131c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent if (is_codec_supported(card, device, COMPRESS_IN, codec) == false) { 132c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent fprintf(stderr, "Error: This codec or format is not supported by DSP\n"); 133c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent return -1; 134c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent } 135c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent return 0; 136c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent} 137c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 138c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurentstatic int print_time(struct compress *compress) 139c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent{ 140c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent unsigned int avail; 141c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent struct timespec tstamp; 142c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 143c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent if (compress_get_hpointer(compress, &avail, &tstamp) != 0) { 144c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent fprintf(stderr, "Error querying timestamp\n"); 145c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent fprintf(stderr, "ERR: %s\n", compress_get_error(compress)); 146c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent return -1; 147c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent } else 148c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent fprintf(stderr, "DSP played %jd.%jd\n", (intmax_t)tstamp.tv_sec, (intmax_t)tstamp.tv_nsec*1000); 149c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent return 0; 150c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent} 151c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 152c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurentint main(int argc, char **argv) 153c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent{ 154c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent char *file; 155c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent unsigned long buffer_size = 0; 156c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent int c; 157c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent unsigned int card = 0, device = 0, frag = 0; 158c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 159c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 160c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent if (argc < 2) 161c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent usage(); 162c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 163c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent verbose = 0; 164c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent while ((c = getopt(argc, argv, "hvb:f:c:d:")) != -1) { 165c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent switch (c) { 166c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent case 'h': 167c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent usage(); 168c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent break; 169c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent case 'b': 170c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent buffer_size = strtol(optarg, NULL, 0); 171c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent break; 172c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent case 'f': 173c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent frag = strtol(optarg, NULL, 10); 174c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent break; 175c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent case 'c': 176c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent card = strtol(optarg, NULL, 10); 177c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent break; 178c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent case 'd': 179c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent device = strtol(optarg, NULL, 10); 180c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent break; 181c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent case 'v': 182c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent verbose = 1; 183c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent break; 184c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent default: 185c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent exit(EXIT_FAILURE); 186c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent } 187c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent } 188c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent if (optind >= argc) 189c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent usage(); 190c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 191c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent file = argv[optind]; 192c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 193c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent play_samples(file, card, device, buffer_size, frag); 194c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 195c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent fprintf(stderr, "Finish Playing.... Close Normally\n"); 196c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent exit(EXIT_SUCCESS); 197c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent} 198c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 199c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurentvoid play_samples(char *name, unsigned int card, unsigned int device, 200c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent unsigned long buffer_size, unsigned int frag) 201c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent{ 202c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent struct compr_config config; 203c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent struct snd_codec codec; 204c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent struct compress *compress; 205c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent struct mp3_header header; 206c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent FILE *file; 207c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent char *buffer; 208c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent int size, num_read, wrote; 209c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent unsigned int channels, rate, bits; 210c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 211c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent if (verbose) 212c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent printf("%s: entry\n", __func__); 213c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent file = fopen(name, "rb"); 214c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent if (!file) { 215c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent fprintf(stderr, "Unable to open file '%s'\n", name); 216c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent exit(EXIT_FAILURE); 217c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent } 218c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 219c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent fread(&header, sizeof(header), 1, file); 220c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 221c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent if (parse_mp3_header(&header, &channels, &rate, &bits) == -1) { 222c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent fclose(file); 223c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent exit(EXIT_FAILURE); 224c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent } 225c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 226c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent codec.id = SND_AUDIOCODEC_MP3; 227c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent codec.ch_in = channels; 228c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent codec.ch_out = channels; 229d885bbf5fb0797a1b728400047bbbc1300cfd055Eric Laurent codec.sample_rate = rate; 23079c370788bfeac8e2951cc35844fb96f15f28159Eric Laurent if (!codec.sample_rate) { 23179c370788bfeac8e2951cc35844fb96f15f28159Eric Laurent fprintf(stderr, "invalid sample rate %d\n", rate); 23279c370788bfeac8e2951cc35844fb96f15f28159Eric Laurent fclose(file); 23379c370788bfeac8e2951cc35844fb96f15f28159Eric Laurent exit(EXIT_FAILURE); 234c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent } 235c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent codec.bit_rate = bits; 236c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent codec.rate_control = 0; 237c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent codec.profile = 0; 238c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent codec.level = 0; 239c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent codec.ch_mode = 0; 240c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent codec.format = 0; 241c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent if ((buffer_size != 0) && (frag != 0)) { 242c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent config.fragment_size = buffer_size/frag; 243c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent config.fragments = frag; 244c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent } else { 245c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent /* use driver defaults */ 246c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent config.fragment_size = 0; 247c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent config.fragments = 0; 248c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent } 249c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent config.codec = &codec; 250c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 251c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent compress = compress_open(card, device, COMPRESS_IN, &config); 252c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent if (!compress || !is_compress_ready(compress)) { 253c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent fprintf(stderr, "Unable to open Compress device %d:%d\n", 254c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent card, device); 255c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent fprintf(stderr, "ERR: %s\n", compress_get_error(compress)); 256c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent goto FILE_EXIT; 257c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent }; 258c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent if (verbose) 259c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent printf("%s: Opened compress device\n", __func__); 260c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent size = config.fragment_size; 261c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent buffer = malloc(size * config.fragments); 262c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent if (!buffer) { 263c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent fprintf(stderr, "Unable to allocate %d bytes\n", size); 264c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent goto COMP_EXIT; 265c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent } 266c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 267c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent /* we will write frag fragment_size and then start */ 268c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent num_read = fread(buffer, 1, size * config.fragments, file); 269c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent if (num_read > 0) { 270c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent if (verbose) 271c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent printf("%s: Doing first buffer write of %d\n", __func__, num_read); 272c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent wrote = compress_write(compress, buffer, num_read); 273c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent if (wrote < 0) { 274c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent fprintf(stderr, "Error %d playing sample\n", wrote); 275c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent fprintf(stderr, "ERR: %s\n", compress_get_error(compress)); 276c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent goto BUF_EXIT; 277c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent } 278c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent if (wrote != num_read) { 279c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent /* TODO: Buufer pointer needs to be set here */ 280c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent fprintf(stderr, "We wrote %d, DSP accepted %d\n", num_read, wrote); 281c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent } 282c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent } 283c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent printf("Playing file %s On Card %u device %u, with buffer of %lu bytes\n", 284c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent name, card, device, buffer_size); 285c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent printf("Format %u Channels %u, %u Hz, Bit Rate %d\n", 286c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent SND_AUDIOCODEC_MP3, channels, rate, bits); 287c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 288c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent compress_start(compress); 289c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent if (verbose) 290c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent printf("%s: You should hear audio NOW!!!\n", __func__); 291c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 292c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent do { 293c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent num_read = fread(buffer, 1, size, file); 294c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent if (num_read > 0) { 295c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent wrote = compress_write(compress, buffer, num_read); 296c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent if (wrote < 0) { 297c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent fprintf(stderr, "Error playing sample\n"); 298c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent fprintf(stderr, "ERR: %s\n", compress_get_error(compress)); 299c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent goto BUF_EXIT; 300c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent } 301c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent if (wrote != num_read) { 302f0c407825741bcb94952e4264efce66dee378411Eric Laurent /* TODO: Buffer pointer needs to be set here */ 303c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent fprintf(stderr, "We wrote %d, DSP accepted %d\n", num_read, wrote); 304c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent } 305c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent if (verbose) { 306c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent print_time(compress); 307c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent printf("%s: wrote %d\n", __func__, wrote); 308c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent } 309c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent } 310c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent } while (num_read > 0); 311c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 312c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent if (verbose) 313f0c407825741bcb94952e4264efce66dee378411Eric Laurent printf("%s: exit success\n", __func__); 314c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent /* issue drain if it supports */ 315c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent compress_drain(compress); 316c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent free(buffer); 317c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent fclose(file); 318c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent compress_close(compress); 319c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent return; 320c902d7fb4e0f2b086030f384ce217679775ca2d4Eric LaurentBUF_EXIT: 321c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent free(buffer); 322c902d7fb4e0f2b086030f384ce217679775ca2d4Eric LaurentCOMP_EXIT: 323c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent compress_close(compress); 324c902d7fb4e0f2b086030f384ce217679775ca2d4Eric LaurentFILE_EXIT: 325c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent fclose(file); 326c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent if (verbose) 327c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent printf("%s: exit failure\n", __func__); 328c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent exit(EXIT_FAILURE); 329c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent} 330c902d7fb4e0f2b086030f384ce217679775ca2d4Eric Laurent 331