source: contrib/API/tools/testpcm.c@ 742

Last change on this file since 742 was 578, checked in by David Azarewicz, 11 years ago

API updates

File size: 4.4 KB
Line 
1#define INCL_DOS
2#define INCL_DOSERRORS
3#include <os2.h>
4#include <stdlib.h>
5#include <stdio.h>
6#include <io.h>
7#include <fcntl.h>
8#include <conio.h>
9#include <math.h>
10
11#include "uniaud.h"
12#include "unidef.h"
13#include "errno.h"
14
15
16int pcms_num[MAX_CARDS] = {0}; // number of pcm instances
17int cards_num = 0; // number of cards
18
19POSS32_DEVCAPS pcmcaps[MAX_CARDS] = {0}; // pointer to pcm caps
20
21UniaudCardInfo *CardInfo[MAX_CARDS] = {0};
22
23snd_pcm_status_t status;
24
25
26int main (int argc, char *argv[])
27{
28 int ver, err, ret;
29 int bytesread, count;
30 int card_id = 0;
31 uniaud_pcm *pcm = NULL;
32 char *Buffer;
33 char *pchTmp;
34 int readed, written, state, fsize;
35 FILE *input_handle;
36
37
38 printf("PCM test tool for UNIAUD. Version 0.01\n");
39 printf("Copyright 2004 by Vlad Stelmahosky aka Vladest\n");
40
41 ver = uniaud_get_version();
42
43 switch (ver)
44 {
45 case -2:
46 printf("Error: uniaud not detected\n");
47 return 1;
48 break;
49 case -1:
50 printf("Error: uniaud error\n");
51 return 1;
52 break;
53 default:
54 if (ver < 111)
55 {
56 printf("Error: unsupported version of uniaud\n");
57 return 1;
58 } else
59 printf("Detected UNIAUD version %1d.%02d.%02d\n", ver/10000, (ver / 100) % 100, ver % 100 );
60 }
61
62 cards_num = uniaud_get_cards();
63 if (!cards_num)
64 {
65 printf("No audio cards detected\n");
66 return 1;
67 }
68
69 printf("Detected %i audio adapter(s)\n", cards_num);
70
71 // set pcm to ON
72 pchTmp = "Master Playback Switch";
73 if (uniaud_mixer_put_value_by_name(card_id,pchTmp, 1, 0, 0) < 0) printf("Error setting %s\n", pchTmp);
74
75 pchTmp = "Master Playback Volume";
76 if (uniaud_mixer_put_value_by_name(card_id,pchTmp,50, 0, 0) < 0) printf("Error setting %s\n", pchTmp);
77 if (uniaud_mixer_put_value_by_name(card_id,pchTmp,50, 1, 0) < 0) printf("Error setting %s\n", pchTmp);
78#if 1
79 pchTmp = "PCM Playback Switch";
80 if (uniaud_mixer_put_value_by_name(card_id,pchTmp, 1, 0, 0) < 0) printf("Error setting %s\n", pchTmp);
81
82 pchTmp = "PCM Playback Volume";
83 if (uniaud_mixer_put_value_by_name(card_id,pchTmp,31, 0, 0) < 0) printf("Error setting %s\n", pchTmp);
84 if (uniaud_mixer_put_value_by_name(card_id,pchTmp,31, 1, 0) < 0) printf("Error setting %s\n", pchTmp);
85#endif
86 readed = written = 0;
87 err = uniaud_pcm_open(card_id, PCM_TYPE_WRITE, 0, 0, 48000, 2, SNDRV_PCM_FORMAT_S16_LE, &pcm);
88 if (pcm && err == 0) {
89 printf("opened. pcm = %x\n", pcm);
90 err = uniaud_pcm_prepare(pcm);
91 printf("prepare err = %i\n", err);
92 uniaud_pcm_status(pcm, &status);
93 if (argc > 1)
94 input_handle = fopen(argv[1], "rb");
95 else
96 input_handle = fopen("debug.wav", "rb");
97 if (!input_handle) {
98 err = uniaud_pcm_close(pcm);
99 printf("Error opening file\n");
100 return 0;
101 }
102 //count = pcm->bufsize;
103 count = pcm->period_size*2;
104 fseek(input_handle, 0L, SEEK_END);
105 fsize = ftell(input_handle);
106 Buffer = malloc(fsize);
107 fseek(input_handle, 0L, SEEK_SET);
108 //memset(Buffer,0, count);
109 bytesread = fread(Buffer, 1, fsize, input_handle);
110 fclose(input_handle);
111 if (fsize != bytesread) {
112 printf("File read error\n");
113 return 0;
114 }
115
116 printf("fsize=%i count=%i\n", fsize, count);
117
118 while (1) {
119 // read file and play into driver
120 if (written >= fsize) break;
121
122 err = uniaud_pcm_write(pcm, Buffer+written, count);
123
124 ret = uniaud_pcm_wait(pcm, 1000);
125 if (ret <= 0) printf("\nerror waiting pcm interrupt %i\n", ret);
126
127 if (err > 0) { // write something
128 written=written+err;
129 printf("\rwritten=%i", written); fflush(stdout);
130 if (written >= fsize) break;
131 }
132 if (err == -EAGAIN) {
133 printf("\nError: eagain\n");
134 continue;
135 }
136 if (err < 0) {
137 if (err < -10000) {
138 printf("\ninternal uniaud err = %i\n", err);
139 break;
140 }
141 state = uniaud_pcm_state(pcm);
142 printf("\nstate after write: %i, err = %i\n",state, err);
143 if ( (state != SND_PCM_STATE_PREPARED) &&
144 (state != SND_PCM_STATE_RUNNING) &&
145 (state != SND_PCM_STATE_DRAINING) ) {
146 printf("write:BAD STATE2, state = %d, going to try XRUN\n",state);
147 if ((ret = uniaud_pcm_prepare(pcm))<0) {
148 printf("xrun: prepare error: %i", err);
149 return 0;
150 }
151 }
152 }
153 }
154 free(Buffer);
155 err = uniaud_pcm_close(pcm);
156 } else {
157 printf("open err: %i, pcm %x\n", err, pcm);
158 if (err == 10005) err = uniaud_pcm_close(pcm);
159 printf("close err: %i\n", err);
160 }
161
162 return 0;
163}
164
Note: See TracBrowser for help on using the repository browser.