+
+#ifdef WORDS_BIGENDIAN
+#define DECODER_SAMPLE_FORMAT SF_S16_BE
+#else
+#define DECODER_SAMPLE_FORMAT SF_S16_LE
+#endif
+
+/**
+ * Execute a btr command for a decoder.
+ *
+ * The buffer tree nodes of the writers ask the parent nodes about sample_rate,
+ * channels count and sample format. This function is called by all decoders to
+ * answer these queries.
+ *
+ * \param cmd The command to be executed by the child node.
+ * \param sample_rate Known to the decoder.
+ * \param channels Known to the decoder.
+ * \param result Ascii representation on the answer is stored here.
+ *
+ * \return Standard.
+ */
+int decoder_execute(const char *cmd, unsigned sample_rate, unsigned channels,
+ char **result)
+{
+ if (!strcmp(cmd, "sample_rate")) {
+ if (sample_rate == 0)
+ return -E_BTR_NAVAIL;
+ *result = make_message("%u", sample_rate);
+ return 1;
+ }
+ if (!strcmp(cmd, "channels")) {
+ if (channels == 0)
+ return -E_BTR_NAVAIL;
+ *result = make_message("%u", channels);
+ return 1;
+ }
+ if (!strcmp(cmd, "sample_format")) {
+ *result = make_message("%d", DECODER_SAMPLE_FORMAT);
+ return 1;
+ }
+ return -ERRNO_TO_PARA_ERROR(ENOTSUP);
+}