LavError createBuffer(LavHandle s, LavHandle& h) { ERRCHECK(Lav_createBufferNode(s, &h)); LavHandle b; ERRCHECK(Lav_createBuffer(s, &b)); ERRCHECK(Lav_bufferLoadFromArray(b, 44100, 4, BUFFER_SIZE/4, buffer)); ERRCHECK(Lav_nodeSetBufferProperty(h, Lav_BUFFER_BUFFER, b)); return Lav_ERROR_NONE; }
void main(int argc, char** args) { if(argc != 2) { printf("Syntax: %s <path>"); return; } char* path = args[1]; LavHandle node; LavHandle simulation; ERRCHECK(Lav_initialize()); ERRCHECK(Lav_createSimulation(44100, 1024, &simulation)); ERRCHECK(Lav_simulationSetOutputDevice(simulation, -1, 2, 2)); ERRCHECK(Lav_createBufferNode(simulation, &node)); LavHandle buffer; ERRCHECK(Lav_createBuffer(simulation, &buffer)); ERRCHECK(Lav_bufferLoadFromFile(buffer, path)); ERRCHECK(Lav_nodeSetBufferProperty(node, Lav_BUFFER_BUFFER, buffer)); LavHandle limit; ERRCHECK(Lav_createHardLimiterNode(simulation, 2, &limit)); ERRCHECK(Lav_nodeConnect(node, 0, limit, 0)); ERRCHECK(Lav_nodeSetEvent(node, Lav_BUFFER_END_EVENT, endOfBufferCallback, nullptr)); ERRCHECK(Lav_nodeConnectSimulation(limit, 0)); //enter the transducer loop. char command[1024]; printf("Commands: q(q)uit, (s)eek, (v)olume, (p)itch bend\n"); printf("pl(a)y/pause\n"); bool isPlaying = true; while(1) { fgets(command, 1023, stdin); if(command[0] == 'q') break; float value; char* start = &command[1]; while(*start == ' ') start+=1; //skip spaces. sscanf(start, "%f", &value); switch(command[0]) { case 'p': Lav_nodeSetFloatProperty(node, Lav_BUFFER_PITCH_BEND, value); break; case 'v': Lav_nodeSetFloatProperty(node, Lav_NODE_MUL, value); break; case 's': Lav_nodeSetDoubleProperty(node, Lav_BUFFER_POSITION, value); break; case 'a': isPlaying = ! isPlaying; Lav_nodeSetIntProperty(node, Lav_NODE_STATE, isPlaying == false ? Lav_NODESTATE_PAUSED: Lav_NODESTATE_PLAYING); break; default: printf("Unrecognized command.\n"); break; } } return; Lav_shutdown(); }