punk@13
|
1 #include <stdio.h>
|
punk@13
|
2 #include <pthread.h>
|
punk@13
|
3 #include <semaphore.h>
|
punk@13
|
4
|
punk@13
|
5 #include "asim/provides/connected_application.h"
|
punk@13
|
6 #include "asim/provides/stats_device.h"
|
punk@13
|
7 //#include "asim/provides/SndfileWavUtil.h"
|
punk@13
|
8
|
punk@13
|
9 #include "asim/rrr/client_stub_AUDIOCORERRR.h"
|
punk@13
|
10
|
punk@13
|
11 using namespace std;
|
punk@13
|
12
|
punk@13
|
13 pthread_mutex_t CONNECTED_APPLICATION_CLASS::lock;
|
punk@13
|
14 pthread_cond_t CONNECTED_APPLICATION_CLASS::cond;
|
punk@13
|
15 sem_t CONNECTED_APPLICATION_CLASS::throttle;
|
punk@13
|
16
|
punk@13
|
17 // constructor
|
punk@13
|
18 CONNECTED_APPLICATION_CLASS::CONNECTED_APPLICATION_CLASS(VIRTUAL_PLATFORM vp) :
|
rlm@23
|
19
|
rlm@23
|
20 clientStub(new AUDIOCORERRR_CLIENT_STUB_CLASS(this))
|
punk@13
|
21 {
|
punk@13
|
22 }
|
punk@13
|
23
|
punk@13
|
24 // destructor
|
punk@13
|
25 CONNECTED_APPLICATION_CLASS::~CONNECTED_APPLICATION_CLASS()
|
punk@13
|
26 {
|
punk@13
|
27 }
|
punk@13
|
28
|
punk@13
|
29 // init
|
punk@13
|
30 void
|
punk@13
|
31 CONNECTED_APPLICATION_CLASS::Init()
|
punk@13
|
32 {
|
punk@13
|
33
|
punk@13
|
34 pthread_mutex_init(&lock, NULL);
|
punk@13
|
35 pthread_cond_init(&cond, NULL);
|
punk@13
|
36 sem_init(&throttle, 0, 64);
|
punk@13
|
37
|
punk@13
|
38 // enable stats
|
punk@57
|
39 // STATS_DEVICE_SERVER_CLASS::GetInstance()->SetupStats();
|
punk@13
|
40 }
|
punk@13
|
41
|
punk@57
|
42 //This isn't called.
|
punk@13
|
43 void
|
punk@13
|
44 CONNECTED_APPLICATION_CLASS::UpdateSemaphore()
|
punk@13
|
45 {
|
punk@13
|
46 sem_post(&throttle);
|
punk@13
|
47 }
|
punk@13
|
48
|
punk@13
|
49 void
|
punk@13
|
50 CONNECTED_APPLICATION_CLASS::EndSimulation()
|
punk@13
|
51 {
|
punk@13
|
52 printf("EndSimulation Called\n");
|
punk@13
|
53 fflush(stdout);
|
punk@13
|
54 pthread_mutex_lock(&lock);
|
punk@13
|
55 // Do something about the race occuring here
|
punk@13
|
56 pthread_cond_signal(&cond);
|
punk@13
|
57 pthread_mutex_unlock(&lock);
|
punk@13
|
58 printf("EndSimulation done\n");
|
punk@13
|
59 fflush(stdout);
|
punk@13
|
60 }
|
punk@13
|
61
|
punk@13
|
62 // main
|
punk@13
|
63 void
|
punk@13
|
64 CONNECTED_APPLICATION_CLASS::Main()
|
punk@13
|
65 {
|
rlm@34
|
66 //rlm: two files
|
punk@13
|
67 FILE *inputFile;
|
punk@52
|
68 FILE *inputFile1;
|
punk@13
|
69 UINT16 sample;
|
punk@52
|
70 UINT16 sample1;
|
rlm@34
|
71
|
rlm@34
|
72 //rlm: not sure if normal ints are ok here; using UINT16 because I know it works
|
punk@52
|
73 UINT16 channel0 = 0;
|
punk@52
|
74 UINT16 channel1 = 1;
|
punk@31
|
75
|
punk@31
|
76 //init processor
|
punk@31
|
77 int sleepCount = 0;
|
punk@31
|
78 int result = 0;
|
punk@31
|
79
|
punk@31
|
80 bool coreFin = false;
|
punk@31
|
81
|
punk@31
|
82 fflush(stdout);
|
punk@31
|
83
|
punk@13
|
84 // Convert input wav to pcm
|
rlm@34
|
85
|
rlm@34
|
86 //rlm: for now we are going to going to just have 2 files with "common names"
|
rlm@34
|
87
|
punk@13
|
88 generate_pcm("input.wav","input.pcm");
|
punk@52
|
89 generate_pcm("input1.wav", "input1.pcm");
|
rlm@34
|
90
|
punk@13
|
91
|
punk@13
|
92 //Send data to the machine here.
|
rlm@34
|
93 //rlm: two files
|
punk@13
|
94 inputFile = fopen("input.pcm","r");
|
punk@53
|
95 inputFile1 = fopen("input1.pcm", "r");
|
rlm@34
|
96
|
punk@52
|
97 assert(inputFile1);
|
punk@13
|
98 assert(inputFile);
|
punk@13
|
99
|
punk@13
|
100 int count = 0;
|
punk@13
|
101
|
punk@57
|
102 printf("main:samples about to start sending %d\n", count);
|
punk@13
|
103
|
rlm@34
|
104 //rlm: here we read both files. later refactor into a function.
|
rlm@34
|
105 // also, this will terminate when the FIRST file reaches its end.
|
punk@52
|
106 while( (fread(&sample, 2, 1, inputFile)) || (fread(&sample1, 2 , 1, inputFile1)))
|
punk@39
|
107 { /*
|
punk@37
|
108 printf("hi\n");
|
punk@37
|
109 if (!coreFin && (result = clientStub->ReadCPUToHost(0)) != 1)
|
punk@37
|
110 {
|
punk@37
|
111 sleepCount++;
|
punk@37
|
112 }
|
punk@37
|
113 else if (!coreFin && result == 1)
|
punk@37
|
114 {
|
punk@37
|
115 printf("\n***SOFT_CORE PASSED***\n");
|
punk@37
|
116 coreFin = true;
|
punk@37
|
117 }
|
punk@39
|
118 */
|
punk@31
|
119
|
punk@37
|
120 if(count%1000 == 0)
|
punk@37
|
121 printf("main: %d\n", count);
|
punk@37
|
122 count++;
|
punk@37
|
123
|
rlm@34
|
124 //rlm: two files.
|
rlm@41
|
125 // clientStub->SendUnprocessedStream( Data,(UINT32)sample);
|
punk@52
|
126 clientStub->SendUnprocessedStream((UINT32)channel0 , Data,(UINT32)sample);
|
punk@52
|
127 clientStub->SendUnprocessedStream((UINT32)channel1 , Data,(UINT32)sample1);
|
punk@13
|
128 }
|
punk@13
|
129
|
punk@13
|
130 printf("main: out of loop\n");
|
punk@13
|
131
|
punk@13
|
132 // Need to put lock here to prevent potential race condition
|
punk@13
|
133 pthread_mutex_lock(&lock);
|
rlm@34
|
134
|
rlm@34
|
135 //rlm: have to send end-files to both voices.
|
rlm@34
|
136 // all of these operations wil eventually be moved into functions.
|
rlm@41
|
137 //clientStub->SendUnprocessedStream(EndOfFile,0);
|
rlm@41
|
138 clientStub->SendUnprocessedStream((UINT32)channel0, EndOfFile,0);
|
punk@52
|
139 clientStub->SendUnprocessedStream((UINT32)channel1, EndOfFile,0);
|
punk@13
|
140
|
punk@13
|
141 printf("main: wait for end of file\n");
|
punk@13
|
142
|
punk@13
|
143 pthread_cond_wait(&cond, &lock);
|
punk@13
|
144 pthread_mutex_unlock(&lock);
|
punk@13
|
145
|
rlm@23
|
146 printf("main: last data out\n");
|
punk@13
|
147
|
punk@13
|
148 // Convert input wav to pcm
|
rlm@34
|
149 // this part is ok because there is always only one input file.
|
punk@13
|
150 generate_wav("out_hw.pcm","input.wav","out_hw.wav");
|
punk@13
|
151
|
punk@13
|
152 printf("generate wav done\n");
|
punk@13
|
153
|
punk@50
|
154 // printf("If you missed it, core %s", coreFin ? "PASSED\n" : "FAILED\n");
|
punk@13
|
155 // Dump the stats file
|
punk@13
|
156
|
punk@13
|
157 STATS_DEVICE_SERVER_CLASS::GetInstance()->DumpStats();
|
punk@13
|
158 STATS_DEVICE_SERVER_CLASS::GetInstance()->EmitFile();
|
punk@13
|
159
|
punk@31
|
160 fflush(stdout);
|
punk@53
|
161 // exit(0);
|
punk@31
|
162 }
|