Mercurial > pygar
view modules/bluespec/Pygar/core/AudioCoreSystem.cpp @ 34:1a21b4cd85ee pygar svn.35
[svn r35] fixed the perl scripts and c files to handle multiple voices
author | rlm |
---|---|
date | Tue, 04 May 2010 12:08:19 -0400 |
parents | 0c775e733b81 |
children | 99519a031813 |
line wrap: on
line source
1 #include <stdio.h>2 #include <pthread.h>3 #include <semaphore.h>5 #include "asim/provides/connected_application.h"6 #include "asim/provides/stats_device.h"7 //#include "asim/provides/SndfileWavUtil.h"9 #include "asim/rrr/client_stub_AUDIOCORERRR.h"11 using namespace std;13 pthread_mutex_t CONNECTED_APPLICATION_CLASS::lock;14 pthread_cond_t CONNECTED_APPLICATION_CLASS::cond;15 sem_t CONNECTED_APPLICATION_CLASS::throttle;17 // constructor18 CONNECTED_APPLICATION_CLASS::CONNECTED_APPLICATION_CLASS(VIRTUAL_PLATFORM vp) :20 clientStub(new AUDIOCORERRR_CLIENT_STUB_CLASS(this))21 {22 }24 // destructor25 CONNECTED_APPLICATION_CLASS::~CONNECTED_APPLICATION_CLASS()26 {27 }29 // init30 void31 CONNECTED_APPLICATION_CLASS::Init()32 {34 pthread_mutex_init(&lock, NULL);35 pthread_cond_init(&cond, NULL);36 sem_init(&throttle, 0, 64);38 // enable stats39 STATS_DEVICE_SERVER_CLASS::GetInstance()->SetupStats();40 }42 void43 CONNECTED_APPLICATION_CLASS::UpdateSemaphore()44 {45 sem_post(&throttle);46 }48 void49 CONNECTED_APPLICATION_CLASS::EndSimulation()50 {51 printf("EndSimulation Called\n");52 fflush(stdout);53 pthread_mutex_lock(&lock);54 // Do something about the race occuring here55 pthread_cond_signal(&cond);56 pthread_mutex_unlock(&lock);57 printf("EndSimulation done\n");58 fflush(stdout);59 }61 // main62 void63 CONNECTED_APPLICATION_CLASS::Main()64 {65 //rlm: two files66 FILE *inputFile;67 FILE *inputFile1;68 UINT16 sample;69 UINT16 sample1;71 //rlm: not sure if normal ints are ok here; using UINT16 because I know it works72 UINT16 channel0 = 0;73 UINT16 channel1 = 1;75 //init processor76 int sleepCount = 0;77 int result = 0;79 bool coreFin = false;83 fflush(stdout);85 // Convert input wav to pcm88 //rlm: for now we are going to going to just have 2 files with "common names"90 generate_pcm("input.wav","input.pcm");91 generate_pcm("input1.wav", "input1.pcm");95 //Send data to the machine here.96 //rlm: two files97 inputFile = fopen("input.pcm","r");98 inputFile = fopen("input1.pcm", "r");100 assert(inputFile1);101 assert(inputFile);103 int count = 0;105 printf("main:PROCESSOR about to enter loop %d\n", count);107 //rlm: here we read both files. later refactor into a function.108 // also, this will terminate when the FIRST file reaches its end.109 while( (fread(&sample, 2, 1, inputFile)) && (fread(&sample1, 2 , 1, inputFile1))) {110 if (!coreFin && (result = clientStub->ReadCPUToHost(0)) != 1)111 {112 sleepCount++;113 if(sleepCount == 200) {114 printf("Failed to get response from hardware, bailing\n\n");115 printf("This means that either your hardware is hanging\n");116 printf("or that the software hasn't given it enough time\n");117 printf("to complete. If you think it needs more time, then\n");118 printf("edit CONNECTED_APPLICATION_CLASS::Main() in ProcessorSystem.cpp\n");119 printf("(connected_application)\n");120 }121 }122 else if (!coreFin && result == 1)123 {124 printf("\n***SOFT_CORE PASSED***\n");125 coreFin = true;126 }128 if(count%1000 == 0)129 printf("main: %d\n", count);130 count++;131 sem_wait(&throttle);133 //rlm: two files.134 clientStub->SendUnprocessedStream(channel0 , Data,(UINT32)sample);135 clientStub->SendUnprocessedStream(channel1 , Data,(UINT32)sample1);137 }139 printf("main: out of loop\n");141 // Need to put lock here to prevent potential race condition142 pthread_mutex_lock(&lock);144 //rlm: have to send end-files to both voices.145 // all of these operations wil eventually be moved into functions.146 clientStub->SendUnprocessedStream(channel0, EndOfFile,0);147 clientStub->SendUnprocessedStream(channel1, EndOfFile,0);149 printf("main: wait for end of file\n");151 pthread_cond_wait(&cond, &lock);152 pthread_mutex_unlock(&lock);154 printf("main: last data out\n");156 // Convert input wav to pcm157 // this part is ok because there is always only one input file.158 generate_wav("out_hw.pcm","input.wav","out_hw.wav");160 printf("generate wav done\n");162 printf("If you missed it, core %s", coreFin ? "PASSED\n" : "FAILED\n");163 // Dump the stats file165 STATS_DEVICE_SERVER_CLASS::GetInstance()->DumpStats();166 STATS_DEVICE_SERVER_CLASS::GetInstance()->EmitFile();168 fflush(stdout);169 exit(0);170 }