punk@13: #include punk@13: #include punk@13: #include punk@13: punk@13: #include "asim/provides/connected_application.h" punk@13: #include "asim/provides/stats_device.h" punk@13: //#include "asim/provides/SndfileWavUtil.h" punk@13: punk@13: #include "asim/rrr/client_stub_AUDIOCORERRR.h" punk@13: punk@13: using namespace std; punk@13: punk@68: #define NUM_VOICES 2 punk@68: punk@13: pthread_mutex_t CONNECTED_APPLICATION_CLASS::lock; punk@13: pthread_cond_t CONNECTED_APPLICATION_CLASS::cond; punk@13: sem_t CONNECTED_APPLICATION_CLASS::throttle; punk@13: punk@68: punk@13: // constructor punk@13: CONNECTED_APPLICATION_CLASS::CONNECTED_APPLICATION_CLASS(VIRTUAL_PLATFORM vp) : rlm@23: rlm@23: clientStub(new AUDIOCORERRR_CLIENT_STUB_CLASS(this)) punk@13: { punk@75: printf("SendSide Constructed\n"); punk@13: } punk@13: punk@13: // destructor punk@13: CONNECTED_APPLICATION_CLASS::~CONNECTED_APPLICATION_CLASS() punk@13: { punk@13: } punk@13: punk@13: // init punk@13: void punk@13: CONNECTED_APPLICATION_CLASS::Init() punk@13: { punk@13: punk@64: printf("InitSend Side\n"); punk@13: pthread_mutex_init(&lock, NULL); punk@13: pthread_cond_init(&cond, NULL); punk@65: sem_init(&throttle, 0, 256); punk@13: punk@13: // enable stats punk@64: //STATS_DEVICE_SERVER_CLASS::GetInstance()->SetupStats(); punk@13: } punk@13: punk@57: //This isn't called. punk@13: void punk@13: CONNECTED_APPLICATION_CLASS::UpdateSemaphore() punk@13: { punk@64: printf("UpdateSemaphore\n"); punk@13: sem_post(&throttle); punk@13: } punk@13: punk@13: void punk@13: CONNECTED_APPLICATION_CLASS::EndSimulation() punk@13: { punk@13: printf("EndSimulation Called\n"); punk@13: fflush(stdout); punk@13: pthread_mutex_lock(&lock); punk@13: // Do something about the race occuring here punk@13: pthread_cond_signal(&cond); punk@13: pthread_mutex_unlock(&lock); punk@13: printf("EndSimulation done\n"); punk@13: fflush(stdout); punk@13: } punk@13: punk@75: bool CONNECTED_APPLICATION_CLASS::areAllFilesComplete(int numVoices, bool isFini[]) punk@75: { punk@75: bool result = false; punk@75: for (int n = 0; n < numVoices; n++) punk@75: result |= isFini[n]; punk@75: return result; punk@75: } punk@75: punk@13: // main punk@13: void punk@13: CONNECTED_APPLICATION_CLASS::Main() punk@13: { punk@75: rlm@34: //rlm: two files punk@75: FILE *inputFiles[NUM_VOICES]; punk@13: UINT16 sample; rlm@34: punk@72: bool fileFini[NUM_VOICES]; punk@75: UINT16 channel[NUM_VOICES]; punk@72: for (int n = 0; n < NUM_VOICES; n++) punk@75: { punk@75: fileFini[n] = false; punk@75: channel[n] = n; punk@75: } punk@72: punk@75: fflush(stdout); punk@75: punk@75: // Convert input wav to pcm punk@75: punk@75: printf("word!\n"); punk@75: punk@75: for (int i = 0; i < NUM_VOICES; i++) punk@75: { punk@75: char filename[256]; punk@75: sprintf(filename, "input%d", i); punk@75: char wavname[256]; punk@75: strcpy(wavname, filename); punk@75: strcat(wavname, ".wav"); punk@75: char pcmname[256]; punk@75: strcpy(pcmname, filename); punk@75: strcat(pcmname, ".pcm"); punk@75: punk@75: printf("Opening audio file %s and creating %s.\n", wavname, pcmname); punk@75: inputFiles[i] = fopen(wavname, "r"); punk@75: punk@75: generate_pcm(wavname, pcmname); punk@75: punk@75: assert(inputFiles[i]); punk@75: } punk@31: punk@31: //init processor punk@31: int sleepCount = 0; punk@31: int result = 0; punk@75: int count = 0; punk@31: punk@72: int numCoreFini = 0; punk@31: punk@64: printf("SendSide Main\n"); punk@31: fflush(stdout); punk@31: punk@13: // Convert input wav to pcm rlm@34: punk@75: sleep(2); punk@57: printf("main:samples about to start sending %d\n", count); punk@13: rlm@34: //rlm: here we read both files. later refactor into a function. rlm@34: // also, this will terminate when the FIRST file reaches its end. punk@75: while(!areAllFilesComplete(NUM_VOICES, fileFini)) punk@72: { punk@65: sem_wait(&throttle); punk@65: punk@37: if(count%1000 == 0) punk@37: printf("main: %d\n", count); punk@37: count++; punk@37: rlm@34: //rlm: two files. punk@75: for (int i = 0; i < NUM_VOICES; i++) punk@68: { punk@75: if (!fileFini[i]) punk@72: { punk@75: if (fread(&sample, 2, 1, inputFiles[i])) punk@75: clientStub->SendUnprocessedStream((UINT32)channel[i] , Data,(UINT32)sample); punk@75: else{ punk@75: fileFini[i] = true; punk@75: numCoreFini++; punk@75: if (numCoreFini >= NUM_VOICES) // Need lock on last eof punk@75: // Need to put lock here to prevent potential race condition punk@75: pthread_mutex_lock(&lock); punk@75: clientStub->SendUnprocessedStream((UINT32)channel[i], EndOfFile,0); punk@75: } punk@72: } punk@72: } punk@72: } punk@13: punk@13: printf("main: out of loop\n"); punk@13: printf("main: wait for end of file\n"); punk@13: punk@13: pthread_cond_wait(&cond, &lock); punk@13: pthread_mutex_unlock(&lock); punk@13: rlm@23: printf("main: last data out\n"); punk@13: punk@13: // Convert input wav to pcm rlm@34: // this part is ok because there is always only one input file. punk@75: generate_wav("out_hw.pcm","input0.wav","out_hw.wav"); punk@13: punk@13: printf("generate wav done\n"); punk@13: punk@50: // printf("If you missed it, core %s", coreFin ? "PASSED\n" : "FAILED\n"); punk@13: // Dump the stats file punk@13: punk@13: STATS_DEVICE_SERVER_CLASS::GetInstance()->DumpStats(); punk@13: STATS_DEVICE_SERVER_CLASS::GetInstance()->EmitFile(); punk@13: punk@31: fflush(stdout); punk@53: // exit(0); punk@31: }