chiark / gitweb /
Use hands-off reader in MP3 decoding.
[disorder] / clients / playrtp.h
index 7885a28a7a695c55074e427456a2479227183795..ff8a76197052ffc4734866d6c8dc1fe9bf11688d 100644 (file)
@@ -2,20 +2,18 @@
  * This file is part of DisOrder.
  * Copyright (C) 2007 Richard Kettlewell
  *
- * This program is free software; you can redistribute it and/or modify
+ * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation, either version 3 of the License, or
  * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 /** @file clients/playrtp.h
  * @brief RTP player
@@ -60,11 +58,15 @@ struct packet {
    *
    * Valid values are:
    * - @ref IDLE - the idle bit was set in the RTP packet
+   * - @ref SILENT - packet is entirely silent
    */
   unsigned flags;
 /** @brief idle bit set in RTP packet*/
 #define IDLE 0x0001
 
+/** @brief RTP packet is entirely silent */
+#define SILENT 0x0002
+
   /** @brief Raw sample data
    *
    * Only the first @p nsamples samples are defined; the rest is uninitialized
@@ -109,14 +111,27 @@ static inline int lt_packet(const struct packet *a, const struct packet *b) {
   return lt(a->timestamp, b->timestamp);
 }
 
+/** @brief Return true if @p p contains @p timestamp
+ *
+ * Containment implies that a sample @p timestamp exists within the packet.
+ */
+static inline int contains(const struct packet *p, uint32_t timestamp) {
+  const uint32_t packet_start = p->timestamp;
+  const uint32_t packet_end = p->timestamp + p->nsamples;
+
+  return (ge(timestamp, packet_start)
+          && lt(timestamp, packet_end));
+}
+
 /** @struct pheap 
  * @brief Binary heap of packets ordered by timestamp */
 HEAP_TYPE(pheap, struct packet *, lt_packet);
 
-struct packet *new_packet(void);
-void free_packet(struct packet *p);
+struct packet *playrtp_new_packet(void);
+void playrtp_free_packet(struct packet *p);
+void playrtp_fill_buffer(void);
+struct packet *playrtp_next_packet(void);
 
-extern const char *device;
 extern struct packet *received_packets;
 extern struct packet **received_tail;
 extern pthread_mutex_t receive_lock;
@@ -128,7 +143,13 @@ extern uint32_t next_timestamp;
 extern int active;
 extern pthread_mutex_t lock;
 extern pthread_cond_t cond;
+extern unsigned minbuffer;
+
+extern int16_t *dump_buffer;
+extern size_t dump_index;
+extern size_t dump_size;
 
+void playrtp_oss(void), playrtp_alsa(void), playrtp_coreaudio(void);
 
 #endif /* PLAYRTP_H */