Problem combining Arduino Ethernet as Webserver and Wave Shield

I have been trying to combine an Arduino Ethernet and a Wave Shield by ladyada but without success. Individually both work perfectly, but when EthernetClient client = server.available(); is called I am unable to deactivate the Wiznet chip by calling pin 10 HIGH. The code I am using for testing is a combination of the WebServer example in Arduino 1.0 and the PiSpeakHC example that comes with the WaveHC library. This is the full code:

#include <SPI.h> 
#include <Ethernet.h>
#include <TextFinder.h>

#include <FatReader.h>
#include <SdReader.h>
#include <avr/pgmspace.h>
#include "WaveUtil.h"
#include "WaveHC.h"

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x5E, 0x16 }; 
IPAddress ip( 192,168,2,17 ); 

EthernetServer server(80);

SdReader card;    // This object holds the information for the card
FatVolume vol;    // This holds the information for the partition on the card
FatReader root;   // This holds the information for the filesystem on the card
FatReader f;      // This holds the information for the file we're play

WaveHC wave;      // This is the only wave (audio) object, since we will only play one at a time

// the names of the WAV files
char* trackname[] = {"0.WAV", "1.WAV", "2.WAV", "3.WAV", "4.WAV",
"5.WAV", "6.WAV", "7.WAV", "8.WAV", "9.WAV", "P.WAV"};

// RAM and SD card checks
int freeRam(void)
  extern int  __bss_end; 
  extern int  *__brkval; 
  int free_memory; 
  if((int)__brkval == 0) {
    free_memory = ((int)&free_memory) - ((int)&__bss_end); 
  else {
    free_memory = ((int)&free_memory) - ((int)__brkval); 
  return free_memory; 

void sdErrorCheck(void)
  if (!card.errorCode()) return;
  putstring("\n\rSD I/O error: ");
  Serial.print(card.errorCode(), HEX);
  putstring(", ");
  Serial.println(card.errorData(), HEX);

int runOnce;

void setup()
  pinMode(10, OUTPUT); // Ethernet SS
  pinMode(4, OUTPUT); // SD card SS
  Ethernet.begin(mac, ip);

  putstring("Free RAM: ");       // This can help with debugging, running out of RAM is bad
  Serial.println(freeRam());      // if this is under 150 bytes it may spell trouble!
    if (!card.init()) {         //play with 8 MHz spi (default faster!)  
    putstring_nl("Card init. failed!");  // Something went wrong, lets print out why
    while(1);                            // then 'halt' - do nothing!
  // enable optimize read - some cards may timeout. Disable if you're having problems
// Now we will look for a FAT partition!
  uint8_t part;
  for (part = 0; part < 5; part++) {     // we have up to 5 slots to look in
    if (vol.init(card, part)) 
      break;                             // we found one, lets bail
  if (part == 5) {                       // if we ended up not finding one  :(
    putstring_nl("No valid FAT partition!");
    sdErrorCheck();      // Something went wrong, lets print out why
    while(1);                            // then 'halt' - do nothing!
  // Lets tell the user about what we found
  putstring("Using partition ");
  Serial.print(part, DEC);
  putstring(", type is FAT");
  Serial.println(vol.fatType(),DEC);     // FAT16 or FAT32?
  // Try to open the root directory
  if (!root.openRoot(vol)) {
    putstring_nl("Can't open root dir!"); // Something went wrong,
    while(1);                             // then 'halt' - do nothing!
  putstring_nl("Files found:");;
  // Whew! We got past the tough parts.
  putstring_nl("Waveshield Ready!");

void loop()
  EthernetClient client = server.available();

if (runOnce == 0){
  runOnce = 1;

// Plays a full file from beginning to end with no pause.
void playcomplete(char *name) {
  // call our helper to find and play this name
  while (wave.isplaying) {
  // do nothing while its playing
  // now its done playing


void playfile(char *name) {
  // see if the wave object is currently doing something
  if (wave.isplaying) {// already playing something, so stop it!
    wave.stop(); // stop it
  // look in the root directory and open the file
  if (!, name)) {
    putstring("Couldn't open file "); Serial.print(name); return;
  // OK read the file and turn it into a wave object
  if (!wave.create(f)) {
    putstring_nl("Not a valid WAV"); return;
  // ok time to play! start playback;

void enableEthernet(){
  digitalWrite(4, HIGH);
  digitalWrite(10, LOW);

void enableWaveShield(){
  digitalWrite(10, HIGH);
  digitalWrite(4, LOW);

With the above code the web server works well, but the wave shield is silent. When I comment out the server part of the code in void loop like in the example below the WAV file is played properly.

void loop()
//  EthernetClient client = server.available();

if (runOnce == 0){
//  client.stop();
  runOnce = 1;

Has anyone experienced such a problem? Is there a solution?

Has anyone experienced such a problem? Is there a solution?

I haven't and possibly.

You have an awful lot of code there that does not contribute to the problem statement. Presumably, you have ruled out SRAM exhaustion as a problem, or you would have mentioned how much memory is available.

If there is indeed sufficient memory, get rid of that code.

Similarly for the SD card initialization. It either initializes right or it doesn't. If it doesn't, presumably you would have told us that. If it does, all the error trapping is making it difficult to study your problem. Create a new tab, move the SD card initialization and error tracking stuff to that tab. We don't need to see it (yet).

Finally, the most likely cause of your problem is a hardware conflict. You have not told us anything about how your wave shield is wired - what pins are you using? The assembly instructions on LadyAda's site call for using most of the pins from 2 to 7. If you did that, that includes the SD card select pin. Not a good thing to have done.