Index: src/engines/gig/EngineChannel.cpp =================================================================== RCS file: /var/cvs/linuxsampler/linuxsampler/src/engines/gig/EngineChannel.cpp,v retrieving revision 1.36 diff -U6 -r1.36 EngineChannel.cpp --- src/engines/gig/EngineChannel.cpp 14 Oct 2007 22:00:16 -0000 1.36 +++ src/engines/gig/EngineChannel.cpp 12 Nov 2007 15:46:38 -0000 @@ -451,12 +451,13 @@ if (pEngine) { Event event = pEngine->pEventGenerator->CreateEvent(); event.Type = Event::type_note_on; event.Param.Note.Key = Key; event.Param.Note.Velocity = Velocity; event.pEngineChannel = this; + if (!event.pEngineChannel) std::cerr << "!!! ERROR !pEngineChannel !!! -> " << __PRETTY_FUNCTION__ << "\n" << std::flush; if (this->pEventQueue->write_space() > 0) this->pEventQueue->push(&event); else dmsg(1,("EngineChannel: Input event queue full!")); } } /** @@ -477,12 +478,13 @@ else if (pEngine) { Event event = pEngine->pEventGenerator->CreateEvent(FragmentPos); event.Type = Event::type_note_on; event.Param.Note.Key = Key; event.Param.Note.Velocity = Velocity; event.pEngineChannel = this; + if (!event.pEngineChannel) std::cerr << "!!! ERROR !pEngineChannel !!! -> " << __PRETTY_FUNCTION__ << "\n" << std::flush; if (this->pEventQueue->write_space() > 0) this->pEventQueue->push(&event); else dmsg(1,("EngineChannel: Input event queue full!")); } } /** @@ -498,12 +500,13 @@ if (pEngine) { Event event = pEngine->pEventGenerator->CreateEvent(); event.Type = Event::type_note_off; event.Param.Note.Key = Key; event.Param.Note.Velocity = Velocity; event.pEngineChannel = this; + if (!event.pEngineChannel) std::cerr << "!!! ERROR !pEngineChannel !!! -> " << __PRETTY_FUNCTION__ << "\n" << std::flush; if (this->pEventQueue->write_space() > 0) this->pEventQueue->push(&event); else dmsg(1,("EngineChannel: Input event queue full!")); } } /** @@ -524,12 +527,13 @@ else if (pEngine) { Event event = pEngine->pEventGenerator->CreateEvent(FragmentPos); event.Type = Event::type_note_off; event.Param.Note.Key = Key; event.Param.Note.Velocity = Velocity; event.pEngineChannel = this; + if (!event.pEngineChannel) std::cerr << "!!! ERROR !pEngineChannel !!! -> " << __PRETTY_FUNCTION__ << "\n" << std::flush; if (this->pEventQueue->write_space() > 0) this->pEventQueue->push(&event); else dmsg(1,("EngineChannel: Input event queue full!")); } } /** @@ -543,12 +547,13 @@ void EngineChannel::SendPitchbend(int Pitch) { if (pEngine) { Event event = pEngine->pEventGenerator->CreateEvent(); event.Type = Event::type_pitchbend; event.Param.Pitch.Pitch = Pitch; event.pEngineChannel = this; + if (!event.pEngineChannel) std::cerr << "!!! ERROR !pEngineChannel !!! -> " << __PRETTY_FUNCTION__ << "\n" << std::flush; if (this->pEventQueue->write_space() > 0) this->pEventQueue->push(&event); else dmsg(1,("EngineChannel: Input event queue full!")); } } /** @@ -567,12 +572,13 @@ } else if (pEngine) { Event event = pEngine->pEventGenerator->CreateEvent(FragmentPos); event.Type = Event::type_pitchbend; event.Param.Pitch.Pitch = Pitch; event.pEngineChannel = this; + if (!event.pEngineChannel) std::cerr << "!!! ERROR !pEngineChannel !!! -> " << __PRETTY_FUNCTION__ << "\n" << std::flush; if (this->pEventQueue->write_space() > 0) this->pEventQueue->push(&event); else dmsg(1,("EngineChannel: Input event queue full!")); } } /** @@ -588,12 +594,13 @@ if (pEngine) { Event event = pEngine->pEventGenerator->CreateEvent(); event.Type = Event::type_control_change; event.Param.CC.Controller = Controller; event.Param.CC.Value = Value; event.pEngineChannel = this; + if (!event.pEngineChannel) std::cerr << "!!! ERROR !pEngineChannel !!! -> " << __PRETTY_FUNCTION__ << "\n" << std::flush; if (this->pEventQueue->write_space() > 0) this->pEventQueue->push(&event); else dmsg(1,("EngineChannel: Input event queue full!")); } } /** @@ -614,12 +621,13 @@ else if (pEngine) { Event event = pEngine->pEventGenerator->CreateEvent(FragmentPos); event.Type = Event::type_control_change; event.Param.CC.Controller = Controller; event.Param.CC.Value = Value; event.pEngineChannel = this; + if (!event.pEngineChannel) std::cerr << "!!! ERROR !pEngineChannel !!! -> " << __PRETTY_FUNCTION__ << "\n" << std::flush; if (this->pEventQueue->write_space() > 0) this->pEventQueue->push(&event); else dmsg(1,("EngineChannel: Input event queue full!")); } } void EngineChannel::ClearEventLists() { @@ -651,12 +659,15 @@ iter != fxSends.end(); iter++ ) { (*iter)->Reset(); } } + // just to debug bug #48 , only to prevent optimizations + volatile int foobar = -2; + /** * Copy all events from the engine channel's input event queue buffer to * the internal event list. This will be done at the beginning of each * audio cycle (that is each RenderAudio() call) to distinguish all * events which have to be processed in the current audio cycle. Each * EngineChannel has it's own input event queue for the common channel @@ -670,12 +681,25 @@ void EngineChannel::ImportEvents(uint Samples) { RingBuffer::NonVolatileReader eventQueueReader = pEventQueue->get_non_volatile_reader(); Event* pEvent; while (true) { // get next event from input event queue if (!(pEvent = eventQueueReader.pop())) break; + + // just to debug bug #48 + if (pEvent->Type == Event::type_note_on) { + // pEngineChannel may only be NULL on engine global events, + // that is only on SysEx messages! (see SendNoteOn()) + if (pEvent->pEngineChannel == NULL) + std::cerr << "pEngineChanell is NULL in note-on event !!!!\n" << std::flush; + // we're forcing a segfault here in case pEngineChannel is NULL, + // so we can get a stack trace that could probably help us to get + // the root cause of this issue + foobar = ((EngineChannel*)pEvent->pEngineChannel)->GetMute(); + } + // if younger event reached, ignore that and all subsequent ones for now if (pEvent->FragmentPos() >= Samples) { eventQueueReader--; dmsg(2,("Younger Event, pos=%d ,Samples=%d!\n",pEvent->FragmentPos(),Samples)); pEvent->ResetFragmentPos(); break;