예제 #1
0
void MessagePipe::processMessage(int inletIndex, PdMessage *message) {
  switch (inletIndex) {
    case 0: {
      MessageElement *messageElement = message->getElement(0);
      switch (messageElement->getType()) {
        case SYMBOL: {
          if (strcmp(messageElement->getSymbol(), "flush") == 0) {
            // TODO(mhroth): output all stored messages immediately
            break;
          } else if (strcmp(messageElement->getSymbol(), "clear") == 0) {
            // TODO(mhroth): forget all stored messages
            break;
          }
          // allow fall-through
        }
        case FLOAT:
        case BANG: {
          message->setTimestamp(message->getTimestamp() + delayMs);
          graph->scheduleMessage(this, 0, message);
          break;
        }
        default: {
          break;
        }
      }
    }
    default: {
      break;
    }
  }
}
예제 #2
0
void MessageSelect::processMessage(int inletIndex, PdMessage *message) {
  switch (inletIndex) {
    case 0: {
      MessageElement *messageElement = message->getElement(0);
      for (int i = 0; i < messageElementList->getNumElements(); i++) {
        MessageElement *selector = (MessageElement *) messageElementList->get(i);
        if (messageElement->equals(selector)) {
          PdMessage *outgoingMessage = getNextOutgoingMessage(i);
          outgoingMessage->setBlockIndex(message->getBlockIndex());
          return;
        }
      }

      setNextOutgoingMessage(messageElementList->getNumElements(), message);
      break;
    }
    case 1: {
      // TODO(mhroth): be able to set the selctor
      break;
    }
    default: {
      break;
    }
  }
}
예제 #3
0
PdMessage *MessagePack::newCanonicalMessage() {
  PdMessage *message = new PdMessage();
  for (int i = 0; i < messageElementList->getNumElements(); i++) {
    MessageElement *messageElement = (MessageElement *) messageElementList->get(i);
    message->addElement(messageElement->copy());
  }
  return message;
}
예제 #4
0
파일: DspSig.cpp 프로젝트: chr15m/ZenGarden
inline void DspSig::processMessage(int inletIndex, PdMessage *message) {
  if (inletIndex == 0) {
    MessageElement *messageElement = message->getElement(0);
    if (messageElement != NULL && messageElement->getType() == FLOAT) {
      processDspToIndex(message->getBlockIndex());
      constWasReset = constant != messageElement->getFloat();
      constant = messageElement->getFloat();
    }
  }
}
예제 #5
0
inline void MessageAbsoluteValue::processMessage(int inletIndex, PdMessage *message) {
  if (inletIndex == 0) {
    MessageElement *messageElement = message->getElement(0);
    if (messageElement != NULL && messageElement->getType() == FLOAT) {
      PdMessage *outgoingMessage = getNextOutgoingMessage(0);
      outgoingMessage->setBlockIndex(message->getBlockIndex());
      outgoingMessage->getElement(0)->setFloat(fabsf(messageElement->getFloat()));
    }
  }
}
void MessageUnaryOperationObject::processMessage(int inletIndex, PdMessage *message) {
  if (inletIndex == 0) {
    // TODO(mhroth): do we need to be able to handle a list of numbers?
    MessageElement *messageElement = message->getElement(0);
    if (messageElement->getType() == FLOAT) {
      PdMessage *outgoingMessage = getNextOutgoingMessage(0);
      outgoingMessage->setBlockIndex(message->getBlockIndex());
      outgoingMessage->getElement(0)->setFloat(performUnaryOperation(messageElement->getFloat()));
    }
  }
}
예제 #7
0
void MessageArcTangent::processMessage(int inletIndex, PdMessage *message) {
  if (inletIndex == 0) {
    MessageElement *messageElement = message->getElement(0);
    if (messageElement->getType() == FLOAT) {
      PdMessage *outgoingMessage = getNextOutgoingMessage(0);
      outgoingMessage->getElement(0)->setFloat(atanf(messageElement->getFloat()));
      outgoingMessage->setTimestamp(message->getTimestamp());
      sendMessage(0, outgoingMessage); // send a message from outlet 0
    }
  }
}
예제 #8
0
Dimension MessageBubble::GetPlaceholderSize() {
	int width = 0, height = 0;

	for (int i=0; i<pElements->GetCount(); i++) {
		MessageElement *pElement = static_cast<MessageElement *>(pElements->GetAt(i));

		if (width < pElement->GetWidth())
			width = pElement->GetWidth();

		height += pElement->GetHeight();

		if (i+1 < pElements->GetCount())
			height += BUBBLE_ITEM_SPACING;

	}

	return Dimension(width, height);
}
예제 #9
0
void MessageLine::processMessage(int inletIndex, PdMessage *message) {
  switch (inletIndex) {
    case 0: {
      MessageElement *messageElement = message->getElement(0);
      switch (messageElement->getType()) {
        case FLOAT: {
          MessageElement *messageElement1 = message->getElement(1);
          if (messageElement1 != NULL && messageElement1->getType() == FLOAT) {
            // start a new line
            processDspToIndex(message->getBlockIndex());
            float delayInMs = StaticUtils::millisecondsToSamples(
                messageElement1->getFloat(), sampleRate);
            samplesToTarget = lrintf(delayInMs);
            target = messageElement->getFloat();
            slope = (target - lastValue) / delayInMs;
          } else {
            // set the current value
            processDspToIndex(message->getBlockIndex());
            target = messageElement->getFloat();
            lastValue = target;
            slope = 0.0f;
            samplesToTarget = -1;
          }
          PdMessage *outgoingMessage = getNextOutgoingMessage(0);
          outgoingMessage->getElement(0)->setFloat(lastValue);
          outgoingMessage->setBlockIndex(message->getBlockIndex());
          break;
        }
        case SYMBOL: {
          MessageElement *messageElement = message->getElement(0);
          if (strcmp(messageElement->getSymbol(), "stop") == 0) {
            processDspToIndex(message->getBlockIndex());
            samplesToTarget = -1;
          } else if (strcmp(messageElement->getSymbol(), "set") == 0) {
            MessageElement *messageElement1 = message->getElement(0);
            if (messageElement1 != NULL && messageElement1->getType() == FLOAT) {
              processDspToIndex(message->getBlockIndex());
              target = messageElement1->getFloat();
              lastValue = target;
              samplesToTarget = -1;
            }
          }
          break;
        }
        default: {
          break;
        }
      }
      break;
    }
    case 1: {
      // not sure what to do in this case
      break;
    }
    default: {
      break;
    }
  }
}
예제 #10
0
void DspPhasor::processMessage(int inletIndex, PdMessage *message) {
  switch (inletIndex) {
    case 0: { // update the frequency
      MessageElement *messageElement = message->getElement(0);
      if (messageElement->getType() == FLOAT) {
        processDspToIndex(message->getBlockIndex(graph->getBlockStartTimestamp(), graph->getSampleRate()));
        frequency = messageElement->getFloat();
      }
      break;
    }
    case 1: { // update the phase
      // TODO(mhroth)
      break;
    }
    default: {
      break;
    }
  }
}
예제 #11
0
inline void MessageFloat::processMessage(int inletIndex, PdMessage *message) {
  if (inletIndex == 0) {
    MessageElement *messageElement = message->getElement(0);
    switch (messageElement->getType()) {
      case FLOAT: {
        constant = messageElement->getFloat();
        // allow fallthrough
      }
      case BANG: {
        PdMessage *outgoingMessage = getNextOutgoingMessage(0);
        outgoingMessage->getElement(0)->setFloat(constant);
        outgoingMessage->setBlockIndex(message->getBlockIndex());
        break;
      }
      default: {
        break;
      }
    }
  }
}
예제 #12
0
void
nsConsoleService::ClearMessagesForWindowID(const uint64_t innerID)
{
  MOZ_RELEASE_ASSERT(NS_IsMainThread());
  MutexAutoLock lock(mLock);

  for (MessageElement* e = mMessages.getFirst(); e != nullptr; ) {
    // Only messages implementing nsIScriptError interface expose the
    // inner window ID.
    nsCOMPtr<nsIScriptError> scriptError = do_QueryInterface(e->Get());
    if (!scriptError) {
      e = e->getNext();
      continue;
    }
    uint64_t innerWindowID;
    nsresult rv = scriptError->GetInnerWindowID(&innerWindowID);
    if (NS_FAILED(rv) || innerWindowID != innerID) {
      e = e->getNext();
      continue;
    }

    MessageElement* next = e->getNext();
    e->remove();
    delete e;
    mCurrentSize--;
    MOZ_ASSERT(mCurrentSize < mMaximumSize);

    e = next;
  }
}
예제 #13
0
inline void DspLine::processMessage(int inletIndex, PdMessage *message) {
  if (inletIndex == 0) { // not sure what the right inlet is for
    switch (message->getNumElements()) {
      case 0: {
        break; // nothing to do
      }
      case 1: {
        // jump to value
        MessageElement *messageElement = message->getElement(0);
        if (messageElement->getType() == FLOAT) {
          processDspToIndex(message->getBlockIndex());
          blockIndexOfLastMessage = message->getBlockIndex();
          target = messageElement->getFloat();
          lastOutputSample = target;
          slope = 0.0f;
          numSamplesToTarget = 0;
        }
        break;
      }
      default: { // at least two inputs
        // new ramp
        MessageElement *messageElement0 = message->getElement(0);
        MessageElement *messageElement1 = message->getElement(1);
        if (messageElement0 != NULL && messageElement0->getType() == FLOAT && 
            messageElement1 != NULL && messageElement1->getType() == FLOAT) {
          processDspToIndex(message->getBlockIndex());
          blockIndexOfLastMessage = message->getBlockIndex();
          target = messageElement0->getFloat();
          float timeToTargetMs = messageElement1->getFloat(); // no negative time to targets!
          float fractionalSamplesToTarget = StaticUtils::millisecondsToSamples(
              (timeToTargetMs < 1.0f) ? 1.0f : timeToTargetMs, sampleRate);
          slope = (target - lastOutputSample) / fractionalSamplesToTarget;
          numSamplesToTarget = (int) fractionalSamplesToTarget;
        }
        break;
      }
    }
  }
}
예제 #14
0
MessagePack::MessagePack(List *messageElementList, char *initString) :
    MessageInputMessageOutputObject(messageElementList->getNumElements(), 1, initString) {
  this->messageElementList = messageElementList;
  for (int i = 0; i < messageElementList->getNumElements(); i++) {
    MessageElement *messageElement = (MessageElement *) messageElementList->get(i);
    if (messageElement->getType() == SYMBOL) {
      if (StaticUtils::isNumeric(messageElement->getSymbol())) {
        float constant = (float) atof(messageElement->getSymbol());
        messageElement->setFloat(constant);
      } else if (strcmp(messageElement->getSymbol(), "float") == 0 ||
                 strcmp(messageElement->getSymbol(), "f") == 0) {
        messageElement->setFloat(0.0f);
      } else if (strcmp(messageElement->getSymbol(), "bang") == 0 ||
                 strcmp(messageElement->getSymbol(), "b") == 0) {
        messageElement->setBang();
      }
    }
  }
}
예제 #15
0
void MessageTimer::processMessage(int inletIndex, PdMessage *message) {
  switch (inletIndex) {
    case 0: {
      MessageElement *messageElement = message->getElement(0);
      if (messageElement->getType() == BANG) {
        processDspToIndex(message->getBlockIndex());
        elapsedSamples = 0.0f;
      }
      break;
    }
    case 1: {
      // return the elapsed number milliseconds
      processDspToIndex(message->getBlockIndex());
      PdMessage *outgoingMessage = getNextOutgoingMessage(0);
      outgoingMessage->getElement(0)->setFloat(1000.0f * elapsedSamples / sampleRate);
      outgoingMessage->setBlockIndexAsFloat(message->getBlockIndexAsFloat());
      break;
    }
    default: {
      break;
    }
  }
}
예제 #16
0
inline void MessagePack::processMessage(int inletIndex, PdMessage *message) {
  MessageElement *messageElement = message->getElement(0);
  MessageElement *outgoingMessageElement = (MessageElement *) messageElementList->get(inletIndex);
  switch (outgoingMessageElement->getType()) {
    case FLOAT: {
      outgoingMessageElement->setFloat(messageElement->getFloat());
      break;
    }
    case SYMBOL: {
      outgoingMessageElement->setSymbol(messageElement->getSymbol());
      break;
    }
    default: {
      break;
    }
  }
  if (inletIndex == 0) {
    PdMessage *outgoingMessage = getNextOutgoingMessage(0);
    outgoingMessage->setBlockIndex(message->getBlockIndex());
    for (int i = 0; i < messageElementList->getNumElements(); i++) {
      messageElement = (MessageElement *) messageElementList->get(i);
      switch (messageElement->getType()) {
        case FLOAT: {
          outgoingMessage->getElement(i)->setFloat(messageElement->getFloat());
          break;
        }
        case SYMBOL: {
          outgoingMessage->getElement(i)->setSymbol(messageElement->getSymbol());
          break;
        }
        default: {
          break;
        }
      }
    }
  }
}
예제 #17
0
void MessageSwap::processMessage(int inletIndex, PdMessage *message) {
  switch (inletIndex) {
    case 0: {
      MessageElement *messageElement = message->getElement(0);
      switch (messageElement->getType()) {
        case FLOAT: {
          left = messageElement->getFloat();

          PdMessage *outgoingMessageRight = getNextOutgoingMessage(0);
          outgoingMessageRight->getElement(0)->setFloat(left);
          outgoingMessageRight->setTimestamp(message->getTimestamp());
          sendMessage(1, outgoingMessageRight); // send a message from outlet 1

          PdMessage *outgoingMessageLeft = getNextOutgoingMessage(1);
          outgoingMessageLeft->getElement(0)->setFloat(right);
          outgoingMessageLeft->setTimestamp(message->getTimestamp());
          sendMessage(0, outgoingMessageLeft); // send a message from outlet 0
          break;
        }
        case BANG: {
          PdMessage *outgoingMessageRight = getNextOutgoingMessage(0);
          outgoingMessageRight->getElement(0)->setFloat(left);
          outgoingMessageRight->setTimestamp(message->getTimestamp());
          sendMessage(0, outgoingMessageRight); // send a message from outlet 1

          PdMessage *outgoingMessageLeft = getNextOutgoingMessage(1);
          outgoingMessageLeft->getElement(0)->setFloat(right);
          outgoingMessageLeft->setTimestamp(message->getTimestamp());
          sendMessage(1, outgoingMessageLeft); // send a message from outlet 0
          break;
        }
        default: {
          break;
        }
      }
      break;
    }
    case 1: {
      MessageElement *messageElement = message->getElement(0);
      if (messageElement->getType() == FLOAT) {
        right = messageElement->getFloat();
      }
      break;
    }
    default: {
      break;
    }
  }
}
예제 #18
0
void MessageSubtract::processMessage(int inletIndex, PdMessage *message) {
  switch (inletIndex) {
    case 0: {
      MessageElement *messageElement = message->getElement(0);
      if (messageElement->getType() == FLOAT) {
        PdMessage *outgoingMessage = getNextOutgoingMessage(0);
        outgoingMessage->getElement(0)->setFloat(messageElement->getFloat() - constant);
        outgoingMessage->setTimestamp(message->getTimestamp());
        sendMessage(0, outgoingMessage); // send a message from outlet 0
      }
      break;
    }
    case 1: {
      MessageElement *messageElement = message->getElement(0);
      if (messageElement->getType() == FLOAT) {
        constant = messageElement->getFloat();
      }
      break;
    }
    default: {
      break;
    }
  }
}
TableViewItem* VKUMessagesListItemProvider::CreateItem(int index, int itemWidth) {
	result r;
	AppLog("VKUMessagesListItemProvider::CreateItem");

	RoundedAvatar *pAvatar; // NOTE: used only if chat and message is out==0
	MessageBubble* pMessageBubble;
	RelativeLayout itemLayout;
	Color bgColor;

	JsonObject *itemObject;
	IJsonValue *itemValue;
	TableViewItem* pItem;
	JsonNumber outNumber;

	ArrayList *pMessageElements;

	Label *pTimeStamp;
	String timespampText;
	int timestampValue;

	String messageText(L"no text????");
	int out = 0, readState = 0;

	// reverse list
	int reversedIndex = _messagesJson->GetCount() - 1 - index;
	AppLog("Item %d of %d", reversedIndex, GetItemCount());

	// get message string
	r = _messagesJson->GetAt(reversedIndex, itemValue);
	TryCatch(r == E_SUCCESS, , "Failed GetAt");
	itemObject = static_cast<JsonObject *>(itemValue);

	JsonParseUtils::GetInteger(*itemObject, L"out", out);
	JsonParseUtils::GetInteger(*itemObject, L"date", timestampValue);
	JsonParseUtils::GetInteger(*itemObject, L"read_state", readState);

	TimeUtils::GetDialogsTime(timestampValue, timespampText);

	// create rich text panel
	AppLog("Message is %d == out", out);
	pMessageBubble = new MessageBubble();
	r = pMessageBubble->Construct(Dimension(itemWidth, LIST_HEIGHT));
	TryCatch(r == E_SUCCESS, , "Failed Construct RichTextPanel");

	pMessageBubble->SetOut(out);
	AppLog("RTPanel created and constructed");
	itemLayout.Construct();

	// get available elements
	pMessageElements = GetMessageElementsN(itemObject, itemWidth);

	// message text element
	for (int i=0; i<pMessageElements->GetCount(); i++) {
		AppLog("Adding element %d to pItem", i);
		MessageElement *pElement = static_cast<MessageElement *>(pMessageElements->GetAt(i));
		pMessageBubble->AddElement(pElement);
		AppLog("Added element %d to pItem with size of %dx%d", i, pElement->GetWidth(), pElement->GetHeight());
	}

	// timestamp label
	pTimeStamp = new Label();
	pTimeStamp->Construct(Rectangle(0, 0, 100, 28), timespampText);
	pTimeStamp->SetTextConfig(28, LABEL_TEXT_STYLE_NORMAL);
	pTimeStamp->SetTextColor(Color(TIMESTAMP_TEXT_COLOR, false));

	// create table item
	pItem = new TableViewItem();
	r = pItem->Construct(itemLayout, Dimension(itemWidth, pMessageBubble->GetHeight() + 2*BUBBLE_VERTICAL_MARGIN));
	TryCatch(r == E_SUCCESS, , "Failed GetAt");

	if (out == 0 && _peerId > 2000000000) {
		int fromId;
		JsonParseUtils::GetInteger(*itemObject, L"from_id", fromId);
		AppLog("Finding avatar for %d", fromId);

		pAvatar = new RoundedAvatar(AVATAR_NORMAL);
		String * avatarUrl = static_cast<String *>(_pUserIdAvatarMap->GetValue(Integer(fromId)));

		pAvatar->Construct(Rectangle(0, 0, 80, 80), *avatarUrl);
		r = pItem->AddControl(pAvatar);
		itemLayout.SetRelation(*pAvatar, pItem, RECT_EDGE_RELATION_LEFT_TO_LEFT);
		itemLayout.SetRelation(*pAvatar, pItem, RECT_EDGE_RELATION_TOP_TO_TOP);
		itemLayout.SetMargin(*pAvatar, 10, 0, 10, 0);
	}

	// add rich text panel to table item
	r = pItem->AddControl(pMessageBubble);
	TryCatch(r == E_SUCCESS, , "Failed AddControl");
	r = pItem->AddControl(pTimeStamp);

	itemLayout.SetCenterAligned(*pMessageBubble, CENTER_ALIGN_VERTICAL);
	itemLayout.SetHorizontalFitPolicy(*pTimeStamp, FIT_POLICY_CONTENT);

	if (out == 1) {
		itemLayout.SetRelation(*pMessageBubble, *pItem, RECT_EDGE_RELATION_RIGHT_TO_RIGHT);
		itemLayout.SetMargin(*pMessageBubble, 0, 10, 0, 0);

		itemLayout.SetRelation(*pTimeStamp, *pMessageBubble, RECT_EDGE_RELATION_RIGHT_TO_LEFT);
		itemLayout.SetRelation(*pTimeStamp, *pItem, RECT_EDGE_RELATION_BOTTOM_TO_BOTTOM);
		itemLayout.SetMargin(*pTimeStamp, 0, 10, 0, 30);
	} else {
		if (_peerId > 2000000000) {
			itemLayout.SetRelation(*pMessageBubble, pAvatar, RECT_EDGE_RELATION_LEFT_TO_RIGHT);
			itemLayout.SetMargin(*pMessageBubble, 10, 0, 0, 0);
		} else {
			itemLayout.SetRelation(*pMessageBubble, *pItem, RECT_EDGE_RELATION_LEFT_TO_LEFT);
			itemLayout.SetMargin(*pMessageBubble, 10, 0, 0, 0);
		}

		itemLayout.SetRelation(*pTimeStamp, *pMessageBubble, RECT_EDGE_RELATION_LEFT_TO_RIGHT);
		itemLayout.SetRelation(*pTimeStamp, *pItem, RECT_EDGE_RELATION_BOTTOM_TO_BOTTOM);
		itemLayout.SetMargin(*pTimeStamp, 10, 0, 0, 30);
	}

	// colors
	if (out == 1 && readState == 0) {
		bgColor = Color(LIST_ITEM_UNREAD_COLOR, false);
	} else {
		bgColor = Color::GetColor(COLOR_ID_BLACK);
	}

	pItem->SetBackgroundColor(bgColor, TABLE_VIEW_ITEM_DRAWING_STATUS_NORMAL);
	pItem->SetBackgroundColor(bgColor, TABLE_VIEW_ITEM_DRAWING_STATUS_PRESSED);
	pItem->SetBackgroundColor(bgColor, TABLE_VIEW_ITEM_DRAWING_STATUS_HIGHLIGHTED);

	pItem->RequestRedraw(true);

	AppLog("Returning item");
	return pItem;

CATCH:
	AppLogException("$${Function:CreateItem} is failed. %s", GetErrorMessage(r));
	return null;
}
예제 #20
0
void MessageSoundfiler::processMessage(int inletIndex, PdMessage *message) {
    if (message->isSymbol(0) && strcmp(message->getSymbol(0), "read") == 0) {
        int currentElementIndex = 1;
        bool shouldResizeTable = false;

        while (currentElementIndex < message->getNumElements()) {
            MessageElement *messageElement = message->getElement(currentElementIndex++);
            if (messageElement->getType() == SYMBOL) {
                // only the -resize flag is supported for now
                if (strcmp(messageElement->getSymbol(), "-resize") == 0) {
                    shouldResizeTable = true;
                } else {
                    // all of the flags should have been seen now and now we expect the last two parameters,
                    // which are file location and destination table name
                    MessageElement *tableNameElement = message->getElement(currentElementIndex++);
                    if (messageElement != NULL && messageElement->getType() == SYMBOL &&
                            tableNameElement != NULL && tableNameElement->getType() == SYMBOL) {
                        MessageTable *table = graph->getTable(tableNameElement->getSymbol());
                        if (table != NULL) {
                            // use libsndfile to load and read the file (also converting the samples to [-1,1] float)
                            SF_INFO sfInfo;
                            char *fullPath = graph->resolveFullPath(messageElement->getSymbol());
                            SNDFILE *sndFile = sf_open(fullPath, SFM_READ, &sfInfo);

                            if (sndFile == NULL) {
                                graph->printErr("soundfiler can't open %s.", fullPath);
                                free(fullPath);
                                return; // there was an error reading the file. Move on with life.
                            }
                            free(fullPath);

                            // It is assumed that the channels are interleaved.
                            int samplesPerChannel = sfInfo.frames;
                            int bufferLength = samplesPerChannel * sfInfo.channels;
                            // create a buffer in memory for the file data
                            float *buffer = (float *) malloc(bufferLength * sizeof(float));
                            sf_read_float(sndFile, buffer, bufferLength); // read the whole file into memory
                            sf_close(sndFile); // release the handle to the file

                            if (sfInfo.channels > 0) { // sanity check
                                // get the table's buffer. Resize the buffer if necessary.
                                int tableLength = samplesPerChannel;
                                float *tableBuffer = shouldResizeTable ? table->resizeBuffer(samplesPerChannel) :
                                                     table->getBuffer(&tableLength);
                                if (tableLength > samplesPerChannel) {
                                    // avoid trying to read more into the table buffer than is available
                                    tableLength = samplesPerChannel;
                                }

                                // extract the first channel
                                for (int i = 0, j = 0; i < bufferLength; i+=sfInfo.channels, j++) {
                                    tableBuffer[j] = buffer[i];
                                }

                                // extract the second channel (if it exists and if there is a table to write it to)
                                if (sfInfo.channels > 1 &&
                                        (tableNameElement = message->getElement(currentElementIndex++)) != NULL &&
                                        tableNameElement->getType() == SYMBOL &&
                                        (table = graph->getTable(tableNameElement->getSymbol())) != NULL) {
                                    tableLength = samplesPerChannel;
                                    tableBuffer = shouldResizeTable ? table->resizeBuffer(samplesPerChannel) :
                                                  table->getBuffer(&tableLength);
                                    if (tableLength > samplesPerChannel) {
                                        // avoid trying to read more into the table buffer than is available
                                        tableLength = samplesPerChannel;
                                    }
                                    for (int i = 1, j = 0; i < bufferLength; i+=sfInfo.channels, j++) {
                                        tableBuffer[j] = buffer[i];
                                    }
                                }
                            }
                            free(buffer);

                            // send message with sample length when all tables have been filled
                            PdMessage *outgoingMessage = getNextOutgoingMessage(0);
                            outgoingMessage->setFloat(0, (float) samplesPerChannel);
                            outgoingMessage->setTimestamp(message->getTimestamp());
                            sendMessage(0, outgoingMessage);
                        }
                    }
                }
            }
        }
    } else if (message->isSymbol(0) && strcmp(message->getSymbol(0), "write") == 0) {
        // TODO(mhroth): not supported yet
        graph->printErr("The \"write\" command to soundfiler is not supported.");
    }
}