Cool, does this replace the existing e2daudiotest I guess? Also, has it already been shown to work on all of the listed board?
On Tue, May 15, 2012 at 9:00 AM, Harsh Prateek Bora <harsh.b...@linaro.org>wrote: > AudiVal (Audio Validation Suite for Linux) > > This is an attempt to automate and integrate various audio related tests > which > can help validate audio on various boards supported by Linaro. Motivation > for > this project comes from various audio tests listed at: > https://wiki.linaro.org/TomGall/LinaroAudioFeatureIndex > > The git repo for this project can be cloned from: > git://git.linaro.org/people/harshbora/audival.git > > Various files required by this script are available in the git repo. > > Requesting all to test this script on various boards that you may have > access > to and share feedback to make it better. > > TODO: Add tests for Audio over USB, Bluetooth. > > Signed-off-by: Harsh Prateek Bora <harsh.b...@linaro.org> > > diff --git a/AudiVal.py b/AudiVal.py > new file mode 100755 > index 0000000..7d56c4e > --- /dev/null > +++ b/AudiVal.py > @@ -0,0 +1,247 @@ > +#!/usr/bin/env python > +# > +# Audival : Audio Validation Suite for Linux. > +# > +# Author: Harsh Prateek Bora > +# <harsh.b...@linaro.org> > +# <ha...@linux.vnet.ibm.com> > + > +import os > +import sys > +import getopt > +from subprocess import * # for calling external programs > +import commands # deprecated since python 2.6, Python 3.0 uses subprocess > + > +def usage(): > + print "=========================================" > + print "AudiVal: Audio Validation Suite for Linux" > + print "=========================================" > + print "Usage:" > + print sys.argv[0], "[--check-info]" > + print > + print "Supported HW: PandaBoard (ES), BeagleBoard (XM), i.MX53, > i.MX6, Origen, Snowball" > + sys.exit(1) > + > +SpeakerJack = { > + 'GenuineIntel': 'Analog', > + 'Panda': 'Headset', > + 'Beagle': 'TWL4030', > + 'i.MX53': 'HiFi', > + 'i.MX6': 'HiFi', > + 'ORIGEN': 'Pri_Dai', > + 'Snowball': 'Headset' > +} > + > +MicJack = { > + 'GenuineIntel': 'Analog', > + 'Panda': 'Headset', # not sure though, arecord doesnt work > for me! > + 'Beagle': 'TWL4030', > + 'i.MX53': 'HiFi', > + 'i.MX6': 'HiFi', > + 'ORIGEN': 'Pri_Dai', > + 'Snowball': 'Headset' > +} > + > +# As and when HDMI out/in device string differs, we'll need 2 > dictionaries. > +HDMI_Audio = { > + 'GenuineIntel': 'HDMI', > + 'Panda': 'HDMI', > + 'Beagle': 'HDMI', > + 'i.MX53': 'HDMI', > + 'i.MX6': 'HDMI', # audio out only supported, audio in not > supported. > + 'ORIGEN': 'HDMI', > + 'Snowball': 'hdmi' # odd one, lowercase > +} > + > +Audio_Devices = { > + 'playback': 'aplay-l.log', > + 'capture': 'arecord-l.log' > +} > + > +def get_device_list(logfile): > + fobj = open(logfile) > + return fobj > + > +def get_card_device_info_by_name(devicestr, fobj): > + """Helper routine to get card, device number by interface name""" > + optxt = fobj.readlines() > + card = "" > + device = "" > + for line in optxt: > + if devicestr in line: > + cardtext, colon, text = line.partition(':') > + pre, sep, card = cardtext.partition(' ') > + devtext, colon, text = text.partition(':') > + pre, sep, device = devtext.partition('device ') > + break > + hwstr = 'plughw:' + card + ',' + device > + if card is "" and device is "": > + return None > + return hwstr > + > +def speaker_test_audio_jack(board): > + fobj = get_device_list(Audio_Devices['playback']) > + print "speaker-test over audio jack .." > + headset_jack_id = get_card_device_info_by_name(SpeakerJack[board], > fobj) > + fobj.close() > + if headset_jack_id is None: > + print "No Audio Jack found !" > + return > + call("date > speaker-test-jack.log", shell=True) > + cmdstr = "speaker-test -D " + headset_jack_id + " -t s -c 2 -l 1 > > speaker-test-jack.log 2>&1" > + call(cmdstr, shell=True) > + print "If you heard beeps from left and right speaker, test passed." > + > +def aplay_over_jack(board): > + fobj = get_device_list(Audio_Devices['playback']) > + headset_jack_id = get_card_device_info_by_name(SpeakerJack[board], > fobj) > + print "Testing aplay over audio jack .." > + fobj.close() > + if headset_jack_id is None: > + print "No Audio Jack found !" > + return > + cmdstr = "aplay login.wav -D " + headset_jack_id > + call(cmdstr, shell=True) > + print "If you heard a stereo sound, test passed." > + # Check dmesg to see if there is an error or I2C error > + call("dmesg | tail | grep error", shell=True) > + print "Note: Error, if any, shall be displayed above." > + > +def arecord_and_aplay_over_audio_jack(board): > + # Record the WAV stream and play it back. > + fobj = get_device_list(Audio_Devices['capture']) > + mic_jack_id = get_card_device_info_by_name(MicJack[board], fobj) > + if mic_jack_id is None: > + print "No Mic Jack found !" > + return > + cmdstr = "arecord -c 2 -f S16_LE -d 10 -r 44100 aud44k16S.wav -D " + > mic_jack_id > + print "Testing arecord over audio jack .." > + print "Started recording audio over jack for 10 seconds (replay > follows) .." > + call(cmdstr, shell=True) > + print "Replaying the recorded audio now .." > + call("aplay aud44k16S.wav", shell=True) > + # Check dmesg to see if there is an error or I2C error > + call("dmesg | tail | grep error", shell=True) > + print "If you heard the recorded audio, test passed." > + print "Note: Error, if any, shall be displayed above." > + fobj.close() > + > +def speaker_test_over_hdmi(board): > + """ speaker-test over HDMI audio interface. """ > + fobj = get_device_list(Audio_Devices['playback']) > + print "Running speaker-test over HDMI .." > + # Automatic detection of card,device number for HDMI interface > + hdmi_hw_id = get_card_device_info_by_name(HDMI_Audio[board], fobj) > + if hdmi_hw_id is None: > + print "No HDMI device found !" > + return > + cmdstr = "speaker-test -D " + hdmi_hw_id + " -t s -c 2 -l 1 > > speaker-test-hdmi.log 2>&1" > + print "speaker-test over HDMI .." > + call(cmdstr, shell=True) > + print "If you heard beeps from left and right speaker, test passed." > + fobj.close() > + > +def arecord_and_aplay_over_hdmi(board): > + """ arecord and aplay over HDMI audio interface. """ > + fobj = get_device_list(Audio_Devices['capture']) > + print "Testing arecord over HDMI .." > + # Automatic detection of card,device number for HDMI interface > + hdmi_hw_info = get_card_device_info_by_name(HDMI_Audio[board], fobj) > + if hdmi_hw_info is None: > + print "No HDMI device found !" > + sys.exit(1) > + return > + arecord_cmd = "arecord -D " + hdmi_hw_info + " -c 2 -f S16_LE -d 10 > -r 44100 aud44k16S.wav" > + aplay_cmd = "aplay -D " + hdmi_hw_info + " aud44k16S.wav" > + print "Started recording audio over HDMI for 10 seconds (replay > follows).." > + call(arecord_cmd, shell=True) > + print "Replaying the recorded audio now .." > + call(aplay_cmd, shell=True) > + # Check dmesg to see if there is an error or I2C error > + call("dmesg | tail | grep error", shell=True) > + print "If you heard the recorded audio, test passed." > + print "Note: Error, if any, shall be displayed above." > + fobj.close() > + > +def mixer_panda(): > + # silently setup mixer using -q > + call("amixer sset Headset 10 -q", shell=True) > + call("amixer sset 'Headset Left Playback' 'HS DAC' -q", shell=True) > + call("amixer sset 'Headset Right Playback' 'HS DAC' -q", shell=True) > + > +def mixer_nop(): > + pass # for unknown mixer settings > + > +MixerSetup = { > + 'GenuineIntel': mixer_nop, > + 'Panda': mixer_panda, > + 'Beagle': mixer_nop, > + 'i.MX53': mixer_nop, > + 'i.MX6': mixer_nop, > + 'ORIGEN': mixer_nop, > + 'Snowball': mixer_nop > +} > + > +def audio_tests(board): > + MixerSetup[board]() > + # minimal speaker test producing a sine wave tone. > + speaker_test_audio_jack(board) > + > + # testing alsa with a stereo sound using aplay over jack > + aplay_over_jack(board); > + # Record a WAV stream using arecord and play it back over jack. > + arecord_and_aplay_over_audio_jack(board) > + > + # speaker-test over HDMI > + speaker_test_over_hdmi(board) # Need to test, dont have HDMI hw ! > + # arecord and aplay over HDMI > + arecord_and_aplay_over_hdmi(board) # Need to test, dont have HDMI hw ! > + > + > +def check_sound_info(): > + print > + print "Running alsa-info.sh ..\n" > + call("alsa-info.sh --stdout", shell=True) > + print "************************************************\n" > + > +def main(): > + cpuinfo = ["Beagle", "Panda", "i.MX6", "i.MX53", "ORIGEN", > "Snowball", "GenuineIntel"] > + long_options = ["check-info"] > + runtest = "" > + try: > + opts, args = getopt.getopt(sys.argv[1:], "", long_options) > + except getopt.GetoptError, err: > + # print help information and exit > + # will print something like "option -a not recognized" > + sys.stderr.writelines(str(err)+"\n") > + usage() > + > + call("aplay -l > aplay-l.log", shell=True) > + call("arecord -l > arecord-l.log", shell=True) > + > + for opt, arg in opts: > + if opt == '--check-info': > + print "Checking Sound/Audio related info ..." > + check_sound_info() > + sys.exit(0) > + else: > + print "unhandled option:", opt > + usage() > + > + cpufile = open("/proc/cpuinfo") > + cputext = cpufile.readlines() > + > + for line in cputext: > + for board in cpuinfo: > + if board in line: > + print "Hardware Detected: %s" % board > + print "Running audiotests for %s .." % board > + audio_tests(board) > + sys.exit(0) > + > + print "Err, looks like your hardware is not supported." > + print "Please report to harsh.b...@linaro.org" > + sys.exit(1) > + > +if __name__ == "__main__": > + main() > diff --git a/login.wav b/login.wav > new file mode 100644 > index 0000000..ec06433 > Binary files /dev/null and b/login.wav differ > > _______________________________________________ > linaro-dev mailing list > linaro-dev@lists.linaro.org > http://lists.linaro.org/mailman/listinfo/linaro-dev >
_______________________________________________ linaro-dev mailing list linaro-dev@lists.linaro.org http://lists.linaro.org/mailman/listinfo/linaro-dev